我從duckrowing博客拿起這個代碼示例:http://www.duckrowing.com/2011/11/09/using-the-singleton-pattern-in-objective-c-part-2/
在.H我們
@interface Foo : NSObject
+ (Foo *) sharedFoo;
@end
,並在.M我們
static SLFoo *sharedInstance = nil;
static dispatch_queue_t serialQueue;
@implementation Foo
- (id)init
{
id __block obj;
dispatch_sync(serialQueue, ^{
obj = [super init];
if (obj) {
;
}
});
self = obj;
return self;
}
+ (Foo *) sharedFoo;
{
static dispatch_once_t onceQueue;
dispatch_once(&onceQueue, ^{
if (sharedInstance) {
return;
}
sharedInstance = [[Foo alloc]init];
});
return sharedInstance;
}
+ (id)allocWithZone:(NSZone *)zone
{
static dispatch_once_t onceQueue;
dispatch_once(&onceQueue, ^{
serialQueue = dispatch_queue_create("com.mydomain.myApp.SerialQueueFoo", NULL);
if (sharedInstance == nil) {
sharedInstance = [super allocWithZone:zone];
}
});
return sharedInstance;
}
@end
通知的allocWithZone 。
你已經在做一個dispatch_once(),是否需要做if(!singletonInstance)?我相信dispatch_once()會爲我們處理其他事情,比如同步。 – pnizzle
@pnizzle你是對的,dispatch_once就足夠了,但檢查實例之前可能會更快。 –
'allocWithZone:'已棄用?看起來像這樣,當我嘗試實施它。 – Fogh