BAD_ACCESS

おもにiOS、ときどき変な電子工作、ガジェット話。

EXC_BAD_ACCESSが出てもうろたえないために

開発しているとどうしてもぶち当たる壁がデバッグ。その中でもEXC_BAD_ACCESSが出るとお手上げ状態。
EXC_BAD_ACCESSは解放済みのオブジェクトに対してアクセスしようとすると発生するエラー。
余分に解放してしまったのはどのオブジェクトなのかを探し当てないといけない。ということでメモ。

通常、EXC_BAD_ACCESSにメッコをつけるためにはNSZombieEnabledを有効にする手段が最も良く知られている。
Xcode4では若干、勝手がかわっているようなので、未確認の方は以下のサイトも参考に。
iPhoneアプリ開発 EXC_BAD_ACCESS対策方法 | はるかなる熊
objective c - How do I set up NSZombieEnabled in Xcode 4? - Stack Overflow

まず、自分のプロジェクトの「Edit Scheme」を開く。(⌘+shift+"<")
「Arguments」タブの「Environment Variables」に3つの項目「NSZombieEnabled」「MallocStackLogging」「NSDebugEnabled」を追加し、すべてYESに設定する。

「Diagnostics(診断の意)」タブも併せて設定しておく。ここでは「Enable Zombie Objects」にチェックを入れておく。


上記のサイトでも紹介されているが、コンソール上でgdbコマンドを実行してより詳細な解放済みオブジェクトを探索することができる。

shell malloc_history {pid/partial-process-name} {address}

こちらもDebug用のNSZombieEnabledの設定と併せて、忘れやすいのでメモしておく。