码迷,mamicode.com
首页 > 其他好文 > 详细

dispatch_once创建单例

时间:2015-01-13 19:47:50      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

 

       单例是开发中使用最常见的一种设计模式,无论创建多少个对象,都返回同一个实例,共享一块内存。OC创建单例,基本上就是定义一个类方法,在里面创建一个 对象,然后返回该对象,下次在创建的时候就会判断是否存在该对象,如果有直接返回,没有则重新创建,当然这个对象是保存在全局静态区的。苹果引入了 GCD,代码量就简化了很多,因此可以使用GCD当中的   void dispatch_once(dispatch_once_t *predicate,dispatch_block_t block) 函数来帮助用户创建一个单例,简单易懂。

 

//
#import <Foundation/Foundation.h>
 
@interface Person : NSObject
 
+ (id)shareInstance;
//+ (id)sharedManager;
@end

 

 

//
#import "Person.h"
//static Person *per = nil;
 
@implementation Person
 
+ (id)shareInstance
{
    static Person *per = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        per = [[Person alloc] init];
    });
    return  per;
    
    
}
 
 
/*
+ (id)sharedManager
{
    @synchronized (self){
        if (per == nil) {
            per = [[super allocWithZone:NULL] init];
        }
    }
    return per;
}
 
+ (id)allocWithZone:(NSZone *)zone
{
    return [[self sharedManager] retain];
}
 
- (id)copyWithZone:(NSZone *)zone
{
    return self;
}
 
- (id)retain
{
    return self;
}
 
- (NSUInteger)retainCount
{
    return NSUIntegerMax;
}
 
- (oneway void)release
{
    //do nothing
}
 
- (id)autorelease
{
    return self;
}
*/
 
@end

 

 

优点:线程安全,不用写@synchronized,或者NSLock 来保证线程安全。

缺点:如果用户使用Person *per = [[Person alloc] init];的形式创建一个对象,那么就不会共享类方法创建的对象。

dispatch_once创建单例

标签:

原文地址:http://www.cnblogs.com/allanliu/p/4222198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!