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;
}
EXC_BAD_ACCESS
吗?另外,你使用的Xcode版本是什么? - NJones