ios dispatch_once崩溃信号SIGABRT

时间:2018-03-19 09:30:54

标签: ios objective-c

我在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);
}
奇怪的是,有些代码有时会崩溃,经过一段时间后它运行良好。 我不知道为什么......

2 个答案:

答案 0 :(得分:2)

有同样的问题,将dispatch_one {}包裹在dispatch_async(dispatch_get_main_queue() ...中,这样就可以了

答案 1 :(得分:0)

我有同样的问题。原因是几乎同时调用两次[... sharedInstance],因此它在第一个完成之前第二次进入dispatch_once块。