iphone - dispatch_once 调用导致崩溃

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

在我将项目转换为 ARC 后,

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

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

根据日志记录和断点,我的代码没有运行到dispatch_once调用的 block 中。

我不知道原因,所以我只是注释掉了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;
}

最佳答案

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

我创建了一个新项目,相同的代码运行正常,因此我检查了项目配置以查看有何不同。

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

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

关于iphone - dispatch_once 调用导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626513/

相关文章:

objective-c - Xcode认为我的项目不再是ARC

ios - 如何使用 google-plus-ios-sdk-1.7.1 sdk 登录 google-plus?

iphone - 如何制作具有快速显示的大图像的 UIScrollView(如 Photos.app)?

ios - "Terminated due to memory issue"

android - multidex 问题,显示在 dexpathlist 中找不到类

iphone - 使用XCode进行调试时,应用可以正常运行,在设备或模拟器上运行时,应用会崩溃

ios - 为什么带有 __weak 限定符的变量会保留一个对象?

javascript - 如何加载 .js 文件 UIWebView

ios - 移动设备管理 iOS

objective-c - 将 init 中的 self 分配给不同的指针