メモリエラーを発見する

2011/01/09

込み入ったアプリを作ってくると、どうしてもメモリ管理が訳の分からない事になる。 (ちゃんと設計していればその可能性は少ないのだが・・・)

XCodeのデバッグコンソールはどこでエラーがあったのかかりにくい。 例えば、

-[CALayer xxxxxx]: message sent to deallocated instance メモリアドレス

みたいなエラーがでてもメモリアドレスを追わないといけない。

エラーの発見方法

このサイトがまとめられてます。 【iPhone】メモリ不足時のシミュレートとデバッグ

要約すると

(1) 実行可能ファイルに以下を追加する - NSZombieEnabled = YES - MallocStackLogging = YES - NSDebugEnabled = YES (2) デバッグビルドしてデバッグコンソールで閲覧 (3) shell malloc_history {PID} {アドレス} (4) エラーメッセージから推測する

話はそれますが自分のエラーは、

「NavigationControlBar画面遷移 + 重たい処理」をスレッド(performSelectorInBackground)処理で、何度か行うとアプリが落ちる

非同期のためalloc、deallocの時間関係がずれて何らかのオブジェクトにアクセスできなかいのが原因ぽいです。 performSelectorInBackgroundをやめるとうまくいくんだな・・・。 ただ単にインジケーターを出したいが為にやってるのですが、改善方法がわからない(^^;) Observerを使った方がいいのかな?