我在GCD遇到崩溃的一次
+ (instancetype)sharedInstance {
static TabBarViewController *_sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[TabBarViewController alloc] init];
});
return _sharedInstance;
}
_dispatch_once(dispatch_once_t *predicate,
DISPATCH_NOESCAPE dispatch_block_t block){
if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
dispatch_once(predicate, block); <-Crash:Thread 1: signal SIGABRT
} else {
dispatch_compiler_barrier();
}
DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);
}
奇怪的是,有些代码有时会崩溃,经过一段时间后它运行良好。
我不知道为什么......
答案 0 :(得分:2)
有同样的问题,将dispatch_one {}
包裹在dispatch_async(dispatch_get_main_queue() ...
中,这样就可以了
答案 1 :(得分:0)
我有同样的问题。原因是几乎同时调用两次[... sharedInstance],因此它在第一个完成之前第二次进入dispatch_once块。