创建单例之经验

今天同事创建了一个单例,但是一调用那个单例就走不到下一行。

追查了半天,发现是在单例里重写了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 关键字多了一层理解。

你可能感兴趣的:(创建单例之经验)