cocoa アプリケーションのロード中に、メッセージ EXC_BAD_ACCESS でプログラムがクラッシュします。スタック トレースは役に立ちません。問題を見つける方法の手がかりはありますか?
6 に答える
適切に保持されていないオブジェクトにアクセスしようとしたときに、オブジェクトの有効なコピーを指していないか、別のタイプのオブジェクトを指している場合に、これが発生することがあります。ブレークポイントを早期に配置し、poを使用して起動を進めながらオブジェクトを分析し、gdbでprintを実行するのが最善の策です。
これは通常、メモリ管理エラーを示しています。
すべてのアウトレット宣言がベスト プラクティスに従っていることを確認してください。
@interface MyClass : MySuperclass {
UIClass *myOutlet;
}
@property (nonatomic, retain) IBOutlet UIClass *myOutlet;
@end
この形式により、スーパークラスを含むすべてのプラットフォームでメモリ管理を正しく行うことができます。
メソッドをチェックawakeFromNib
して、オブジェクトなどを過剰に解放していないことを確認してください。
古いスレッドに対する新しい回答... XCode 4 で EXC_BAD_ACCESS 例外を診断する最も効果的な方法は、Instruments を使用してアプリをプロファイリングすることです (XCode から Product/Profile をクリックし、Zombies を選択します)。これは、割り当て解除されたオブジェクトに送信されたメッセージを識別するのに役立ちます。
コンソール ログ ( Applications/Utilities/Console.app ) を確認します。プログラムが起動時にクラッシュし、初期化に何か問題がある場合、クラッシュする前に役立つエラー メッセージがそこに書き込まれることがよくあります。
追記: アンアーカイブに失敗する最大の理由は、「return self;」を忘れていることです。カスタム クラスの -init から。それはとても痛かった(心を傷つけた :(
これが考えられる理由の 1 つです。初期化されていない IBOutlet オブジェクトがあり、nil でメッセージが呼び出されています。スタック トレースは次のようになります。
#0 0x90a594c7 in objc_msgSend
#1 0xbffff7b8 in ??
#2 0x932899d8 in loadNib
#3 0x932893d9 in +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:]
#4 0x9328903a in +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:]
#5 0x93288f7c in +[NSBundle(NSNibLoading) loadNibNamed:owner:]
#6 0x93288cc3 in NSApplicationMain
#7 0x00009f80 in main at main.mm:17
スタック トレースは役に立たないため、コードをステップ実行してエラーを見つける必要があります。何らかの理由で実行の早い段階でブレークポイントを設定できない場合は、Debugger(); を挿入してみてください。デバッガーにブレークする呼び出し。