特定场景下会引发 dispatch_once 死锁
Created by: MoLice
假设有如下代码:
@interface TestVC : UIViewController
@end
@implementation TestVC
+ (void)initialize {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[TestVC.alloc init];// 这里会触发 -[UIViewController (DoraemonVCProfiler) createAndHookKVOClass],后者会调用 addObserver:forKeyPath:,而 addObserver:forKeyPath: 会重新触发该 class 的 +initialize,由于同一个 dispatch_once 的前一次调用还未结束就执行第二次调用,引发死锁
});
}
@end
在引入 DoraemonKit 3.0beta3 时启动会产生死锁,具体原因在上述代码的注释里有写。
下面是可复现的 Demo:
相关信息:
- 模拟器 iOS 13.3
- DoraemonKit 版本:3.0beta3