在定义 `dispatch_once` 时,应用程序在 `once.h` 中因 SIGABRT 崩溃

pka*_*amb 5 xcode cocoa ios

我突然收到了SIGABRTdispatch_once如下面的 Xcode 所示。

最近没有添加任何更改使用dispatch_once.

dispatch_once(predicate, block); 线程 1:信号 SIGABRT

dispatch_once 中的 SIGABRT

#if DISPATCH_ONCE_INLINE_FASTPATH
DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
DISPATCH_SWIFT3_UNAVAILABLE("Use lazily initialized globals instead")
void
_dispatch_once(dispatch_once_t *predicate,
        DISPATCH_NOESCAPE dispatch_block_t block)
{
    if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
        dispatch_once(predicate, block);
    } else {
        dispatch_compiler_barrier();
    }
    DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);
}
#undef dispatch_once
#define dispatch_once _dispatch_once
#endif
#endif // DISPATCH_ONCE_INLINE_FASTPATH
Run Code Online (Sandbox Code Playgroud)

pka*_*amb 1

就我而言,当故事板和类文件添加到项目中,并自动添加到主目标,但未添加到辅助目标的目标成员资格时,就会出现此问题

该问题仅发生在 iOS 模拟器中,使用我们专门用于模拟器的目标。

由于没有对该类的实际引用,编译器未捕获该问题。相反,使用对 Storyboard 名称的字符串类型引用来构造视图:

[UIStoryboard storyboardWithName:@"storyboardFileThatWasNotAddedToThisTarget" bundle:nil];
Run Code Online (Sandbox Code Playgroud)

通过将新文件添加到辅助目标来修复:

将目标成员资格添加到次要目标

通过向 Xcode 调试器添加异常断点发现问题。