在我将项目转换为 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/