4

dispatch_once 将项目转换为 ARC 后,调用会导致崩溃(在模拟器中)。

我最初的问题是我EXC_BAD_ACCESS的一个单例对象的 + (SingletonClass)shared { ... dispatch_once(..., ^{}); (在 objc_retain 调用中)崩溃了。... } 方法恰好在 dispatch_once 调用前一行。

基于日志记录和断点,我的代码没有运行到 dispatch_once 调用的块中。

我不知道原因,所以我刚刚注释掉了 dispatch_once 调用。没有那个电话,我的应用程序还没有崩溃。

之后,我尝试将 dispatch_once 放入我的应用程序之前调用的方法中。基于此,我知道 Xcode 指向恰好在 dispatch_once 调用之前的行,而不管 dispatch_once 调用的方法是什么。

对我来说主要的谜团是只有在模拟器中运行应用程序时才能重现。在设备上运行应用程序没有任何问题。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"I will crash if you won't delete the dispatch_once after me and you run me in the iOS Simulator... If you run me on a device there won't be any problem with me...");

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        int a = 42;
    });

    return NO;
}
4

1 回答 1

1

在一个基于PhoneGap的项目中,我一直在解决这个完全相同的问题一段时间,我不久前已经转换为ARC——在模拟器中崩溃但在设备上没有。

我创建了一个新项目,并且相同的代码运行良好,所以我通过项目配置查看有什么不同。

就我而言,我设置了旧的不需要的链接器标志,特别是-weak_library /usr/lib/libSystem.B.dylib.

从“构建设置”的“其他链接器标志”部分中删除它修复了它。

于 2013-03-08T21:21:18.650 回答