單例引發(fā)奔潰
dispatch_once(predicate, block); Thread 1: EXC_BREAKPOINT (code=1, subcode=0
代碼如下,
首先, 調(diào)用了Querulous中的某個(gè)方法,[[Querulous sharedInstance] crenellated],這個(gè)時(shí)候已經(jīng)開(kāi)始調(diào)用了通過(guò)實(shí)例調(diào)用了 [instance th], 如果在 [instance th] 還沒(méi)完成的情況下再調(diào)用[Querulous sharedInstance],就很容易出現(xiàn)卡死的狀態(tài),原理可以看看這篇文章濫用單例dispatch_once而造成的死鎖問(wèn)題
+(Querulous *)sharedInstance {
static Querulous *instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[Querulous alloc] init];
instance.level = 3;
[instance th];
});
return instance;
}
- (void)th
{
NSTimer *timer = [NSTimer timerWithTimeInterval:0 target:self selector:@selector(hill) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[timer fire];
self.timer = timer;
}
- (void)hill
{
if (self.trainers) {
[self.timer invalidate];
if ([self.trainers.allKeys containsObject:@"status"]) {
}
}
}