单例是开发中使用最常见的一种设计模式,无论创建多少个对象,都返回同一个实例,共享一块内存。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];的形式创建一个对象,那么就不会共享类方法创建的对象。
时间: 2024-10-17 12:10:11