dispatch_once
在我将项目转换为 ARC 后,调用会导致崩溃(在模拟器中)。
我最初的问题是我有EXC_BAD_ACCESS
(在 objc_retain 调用中)我的单例对象之一崩溃 + (Singleton Class)shared { ...dispatch_once(..., ^{}); ... } 方法正好位于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;
}
我在一个基于 PhoneGap 的项目中一直在与这个完全相同的问题作斗争一段时间,我不久前已转换为 ARC - 在模拟器中崩溃,但在设备上却没有。
我创建了一个新项目,相同的代码运行正常,因此我检查了项目配置以查看有何不同。
就我而言,我设置了旧的不需要的链接器标志,特别是-weak_library /usr/lib/libSystem.B.dylib
.
从“构建设置”的“其他链接器标志”部分中删除它修复了它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)