首页 > 代码库 > dispatch_once创建单例

dispatch_once创建单例

 

       单例是开发中使用最常见的一种设计模式,无论创建多少个对象,都返回同一个实例,共享一块内存。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创建单例