单例引发奔溃
dispatch_once(predicate, block); Thread 1: EXC_BREAKPOINT (code=1, subcode=0
代码如下,
首先, 调用了Querulous中的某个方法,[[Querulous sharedInstance] crenellated]
,这个时候已经开始调用了通过实例调用了 [instance th]
, 如果在 [instance th]
还没完成的情况下再调用[Querulous sharedInstance]
,就很容易出现卡死的状态,原理可以看看这篇文章滥用单例dispatch_once而造成的死锁问题
+(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"]) {
}
}
}