今天同事创建了一个单例,但是一调用那个单例就走不到下一行。
追查了半天,发现是在单例里重写了Init方法,然而在init方法里面的参数的参数的参数里面又调用了shareManager.相当于递归调用。但是并没有崩溃,也没有内存暴涨。
经追查,原因是dispatch_once_t阻止了递归的继续调用,相当于造成了死锁。dispatch_once_t始终在递归,执行不完。而递归又在等待dispatch_once_t,两者相互等待。一直死等。人为造成死锁。实例代码如下:+ (HMQuickReactionManager*)shareManager
{
static dispatch_once_tonce;
static HMQuickReactionManager*manager =nil;
dispatch_once(&once, ^{
[HMQuickReactionManager shareManager ];
manager = [[HMQuickReactionManager alloc]init];
}
);
returnmanager;
}
有趣的是,把[HMQuickReactionManager shareManager ];挪到下面manager = [[HMQuickReactionManageralloc]init];就不会崩溃了。大家想一下吧。
对 static 关键字多了一层理解。