dispatch_asyncの内部コードが実行されない時

2015年10月13日

dispatch_asyncの内部コードが最後まで実行されず原因を調べた。
原因はsingletone実装の問題があった。

dispatch_asyncで呼ばれたsingletoneオグジェクトが
正しく初期化されないことが原因。

[だめな方法]
+(MyClass) shared
{
static MyClass *_sharedInstance = nil;
if(_sharedInstance == nil){
dispatch_once_t onceTokeon;
dispatch_once(&onceTokeon, ^{
_sharedInstance = [[MyClass alloc] init];
});
}
return _sharedInstance;

}

[正しい方法]
+(MyClass *){
static MyClass *sharedInstance;
@synchronized(self) {
if (sharedInstance == nil) {
sharedInstance = [[MyClass alloc] init];
}
}
return sharedInstance;
}

[Apple 推奨]
+(MyClass *) shared
{
static MyClass *_sharedInstance = nil;
static dispatch_once_t onceToken = 0;
dispatch_once(&onceToken, ^{
_sharedInstance = [[MyClass alloc] init];
});
return _sharedInstance;
}

Comments are closed.