dispatch_once
プロジェクトを ARC に変換した後、呼び出しによって (シミュレーターで) クラッシュが発生します。
私の最初の問題はEXC_BAD_ACCESS
、シングルトン オブジェクトの + (SingletonClass)shared { ... dispatch_once(..., ^{}); のいずれかで (objc_retain 呼び出しで) クラッシュしたことでした。... } メソッドは、dispatch_once 呼び出しのちょうど 1 行前に配置されます。
ログとブレークポイントに基づいて、私のコードは 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;
}