私のメイン アプリ コントローラーは、サブコントローラーを呼び出して、特定の一連の画面を処理します。メイン コントローラーは、サブコントローラーのデリゲートとして自分自身を設定します。サブコントローラーが処理を完了すると、デリゲートに通知します。時々、この通知は EXC_BAD_ACCESS で失敗します。
0) gdb に基づくと、objc_msgSend で問題が発生します。両方のレジスタにゼロ以外の値があります。
gdb: 0x3367cc98 <+0016> ldr r5, [r4, #8]
1) 問題を追跡するために NSZombiesEnabled を試しましたが、再現できませんでした。2)問題のあるコマンドの直前にブレークポイントを設定しようとしましたが、問題を再現できません。
何が起こっているのかわかりません。
これはデリゲート プロパティの宣言です (親コントローラーは子コントローラーよりも長生きします)。
@property (assign) id<ParentControllerDelegate> delegate
これは問題のあるコードです:
- (void) doStuff {
if(mode == Done) {
NSLog(@"Done. Handling back control");//this is the last log displayed by the console
[self.delegate done: self];
} else {
// some controller code
}
これはデリゲート側のコードです (デリゲートはメイン コントローラーであるため、App_Delegate によって保持されています)。
- (void) done: (UIViewController *) caller {
NSLog(@"Taken back control");// this never displays
[caller.view removeFromSuperview];
[caller release];
}
追加情報: メイン コントローラーはサブコントローラーを保持します。また、呼び出されたときにログに記録するように、メイン コントローラーとサブ コントローラーの両方の deallocs を変更しました。表示されているログに基づいて、どちらもアプリケーションの過程で呼び出されることはありません。したがって、メッセージの受信者と送信者の両方が有効なオブジェクトです。
私はここで本当に途方に暮れています。あなたの助けを楽しみにしています。