

Objective-Cでプログラミング中、main.m内のreturn UIApplicationMain(argc, argv, nil,
NSStringFromClass([AppDelegate class]));でEXC_BAD_ACCESSという実行時エラーに遭遇しました。  
all exceptionにブレークポイントを設定しても同じ箇所で落ち、zombie
objectを設定してもエラーメッセージを吐かないためお手上げ状態です。  
原因箇所を突き止める方法として他にどのようなものがありますでしょうか？  
コード自体を載せることはできないのですが、同じような経験ある方いましたら教えていただければ幸いです。


CC BY-SA 3.0
2015-11-09T05:13:29.497
18560
2016-10-26T01:48:08.303
2015-11-10T00:17:46.093
13180
13180
question
ios objective-c
main.mでEXC_BAD_ACCESSが起きる場合の原因特定方法


下記の記事が役立つかと思います

  * [EXC_BAD_ACCESS in main.m](https://stackoverflow.com/questions/6349967/exc-bad-access-in-main-m)
  * [EXC_BAD_ACCESS within main() with ARC but no hint on the error](https://stackoverflow.com/questions/9200941/exc-bad-access-within-main-with-arc-but-no-hint-on-the-error).

zombieで囲んでいるのが原因だと思います。  
あなたのコード特有の問題かもしれませんので、あなたのコードで問題を追わなければなりません。  
ブレイクポイントを使用してください。


CC BY-SA 3.0
2015-11-10T01:10:28.553
18592
2015-11-10T02:11:10.363
2017-05-23T12:38:56.083
-1
13191
18560
answer


AutoreleasePoolで解放済みの領域(参照カウンタが0)の領域をさらに解放しようとするとこのようなエラーが出ます。  
次のようなコードで簡単に起こすことができます。(ARCは未使用)

[code]

    #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
    
[/code]

Point1でlblを作成(参照カウンタ+1)してAutoreleasePoolに登録します。  
Point2でlblを手動解放することで参照カウンタを-1して参照カウンタを0になり、この時点でlblのメモリが解放されます。  
このブロックを抜けてmain関数に戻り、AutoreleasePoolが解放されると、AutoreleasePoolに登録されているlblはさらに参照カウンタを-1しようとします。  
しかし、すでに解放済みのlblの領域にアクセスしようとするのでEXC_BAD_ACCESSになります。

見直す点はretainとreleaseの数だと思います。  
ARCを使用していたとしても、この問題が発生する可能性はゼロではありません。  
(ARCを使わない人間なので、ARCを使ったときの例は挙げることはできません。)

問題個所の調べ方についてですが、  
問題発生個所を問題が発生しなくなる範囲で一度コメントアウトして、徐々に解除して動作を確認する牛歩作戦のような方法がいいのではないでしょうか。  
コメント解除して、落ちるようになったらその解除した範囲が怪しいです。  
コードを載せていただけない以上、アドバイスはこれが限界です。


CC BY-SA 3.0
2016-07-11T04:52:11.767
27519
2016-07-11T04:52:11.767
17014
18560
answer