非同期ディスパッチを使用しているときに、非常に奇妙なアクセス エラーが発生します。私は自分のプログラムでこのコード セグメントにまで削減することができました。
-(void)buttonTapped:(id)sender {
__block NSArray*foo = nil;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
//Foo was initially declared here but then moved it outside.
foo = [self someMethod];
[foo retain]; // bad access here. Why ?
dispatch_async(dispatch_get_main_queue(),0) {
// doesnt matter what happens here
}); });
}
-(id)someMethod
{
return [self secondMethod];
}
-(id)secondMethod
{
// was initially returning an autoreleased object from here. Changed it
// to eliminate that as source of the error.
id newThing = [[NSObject alloc] init];
return newThing;
}
コードは最初はこのようには見えませんでしたが、現在はこのようになっています。ダミーの NSObject の割り当てを含みます。
foo がディスパッチ async 内の呼び出しの間に解放される可能性はありますか? これがどのように可能かわかりません。これだけで何が起こっているのかを示唆するのは難しいことを知っていますが、デバッグの提案は役に立ちます。NSZombies をオンにしてみましたが、ゾンビが表示されません。