質問: Objective-Cでプログラミング中、main.m内のreturn UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));でEXC_BAD_ACCESSという実行時エラーに遭遇しました。 all exceptionにブレークポイントを設定しても同じ箇所で落ち、zombie objectを設定してもエラーメッセージを吐かないためお手上げ状態です。 原因箇所を突き止める方法として他にどのようなものがありますでしょうか? コード自体を載せることはできないのですが、同じような経験ある方いましたら教えていただければ幸いです。
回答: AutoreleasePoolで解放済みの領域(参照カウンタが0)の領域をさらに解放しようとするとこのようなエラーが出ます。 次のようなコードで簡単に起こすことができます。(ARCは未使用) ``` #import "ViewController.h" @interface ViewController () { UILabel *lbl; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //Point1 lbl = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 20)] autorelease]; //Point2 [lbl release]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end ``` Point1でlblを作成(参照カウンタ+1)してAutoreleasePoolに登録します。 Point2でlblを手動解放することで参照カウンタを-1して参照カウンタを0になり、この時点でlblのメモリが解放されます。 このブロックを抜けてmain関数に戻り、AutoreleasePoolが解放されると、AutoreleasePoolに登録されているlblはさらに参照カウンタを-1しようとします。 しかし、すでに解放済みのlblの領域にアクセスしようとするのでEXC_BAD_ACCESSになります。 見直す点はretainとreleaseの数だと思います。 ARCを使用していたとしても、この問題が発生する可能性はゼロではありません。 (ARCを使わない人間なので、ARCを使ったときの例は挙げることはできません。) 問題個所の調べ方についてですが、 問題発生個所を問題が発生しなくなる範囲で一度コメントアウトして、徐々に解除して動作を確認する牛歩作戦のような方法がいいのではないでしょうか。 コメント解除して、落ちるようになったらその解除した範囲が怪しいです。 コードを載せていただけない以上、アドバイスはこれが限界です。