dispatch_once调用导致崩溃

时间:2012-11-29 13:06:25

标签: iphone crash automatic-ref-counting exc-bad-access grand-central-dispatch

我将项目转换为ARC后,

dispatch_once调用导致崩溃(在模拟器中)。

我最初的问题是我的单个对象的+(SingletonClass)共享{... dispatch_once(...,^ {})中有EXC_BAD_ACCESS(在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;
}

1 个答案:

答案 0 :(得分:1)

我已经在基于PhoneGap的项目上对这个完全相同的问题进行了一段时间的战斗,我在一段时间内转换为ARC - 在模拟器中崩溃但在设备上没有崩溃。

我创建了一个新项目,相同的代码工作正常,所以我通过项目配置来查看不同的内容。

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

从"其他链接标记"中删除它"构建设置"修好了。