dispatch_once调用导致崩溃

4

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

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

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

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

之后,我尝试将dispatch_once放入我的应用程序较早调用的方法中。根据这个,我知道无论dispatch_once调用的方法是什么,Xcode都会指向恰好在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
让我们看一些代码 ^^ 100个可能发生的原因 - Daij-Djan
没有任何东西会被修改,而且那段代码对我来说并没有崩溃(我刚试过了)。 - Daij-Djan
我明白了,但是转换为ARC后有些东西变得很糟糕了...在使用ARC之前,使用相同的代码没有任何问题。还有一件事情:转换为ARC意味着我必须将编译器从LLVM GCC改为Apple LLVM... - stoflow
这个问题似乎有些遗漏。你是说如果按照你在问题中发布的代码完全运行,会出现EXC_BAD_ACCESS吗?另外,你使用的Xcode版本是什么? - NJones
你遇到了同样的问题,除了检查其他链接器标志之外,你找到了其他的解决方案吗?我的代码在模拟器中仍然崩溃 :/ - Dominik Hadl
显示剩余3条评论
1个回答

1
我最近在一个基于PhoneGap的项目上遇到了相同的问题,我之前已经将它转换为ARC,模拟器上会崩溃但是设备上不会。
我创建了一个新项目,同样的代码可以正常工作,所以我检查了项目配置,看看有什么不同。
在我的情况下,我设置了旧的不必要的链接器标志,具体来说是-weak_library /usr/lib/libSystem.B.dylib
将其从“Build Settings”的“Other Linker Flags”部分中移除即可解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接