目前了解到Objective C 实现singleton有3种方式
1.Initialize方法实现
static MySingleton *sharedSingleton; + (void)initialize { static BOOL initialized = NO; if(!initialized) { initialized = YES; sharedSingleton = [[MySingleton alloc] init]; } }
Note: 若该类有子类,那么会返回父类的实例而非我们期望子类的实例,因此要清楚的知道该单例有无子类。
可用 self == [MySingletonClass class] ]
进行判断,或者子类要override父类的initialize方法,
该方法有时会比dispatch_once()方法要快。Update for 子类initialize方法的影响
<span style="font-family:Microsoft YaHei;">@implementation MySingletonClass static MySingletonClass * _instance; + (void) initialize { if (self == [MySingletonClass class]){ _instance = [[MySingletonClass alloc] init]; } } - (id) init { ZAssert (_instance == nil, @"Duplication initialization of singleton"); self = [super init]; if (self) { // Initialization } return self; } + (id) getInstance { return _instance; } @end</span>
2.synchronized方式
@interface MySingleton : NSObject { } + (MySingleton *)sharedSingleton; @end @implementation MySingleton + (MySingleton *)sharedSingleton { static MySingleton *sharedSingleton; @synchronized(self) { if (!sharedSingleton) sharedSingleton = [[MySingleton alloc] init]; return sharedSingleton; } } @end
3.dispatch_once方式
+ (instancetype)sharedInstance { static MyClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[MyClass alloc] init]; // Do any other initialisation stuff here }); return sharedInstance; }
Reference List:dispatch_once()
是同步的,即便多线程访问也是安全的,并非所有的GCD方式都是同步的,dispatch_once()比synchronizeed方法更快,且仅被调用一次,推荐使用dispatch_once方式。
- What should my Objective-C singleton look like?
- Why does Apple recommend to use dispatch_once for implementing the singleton pattern under ARC?
- Singleton with ARC