日々精進

新しく学んだことを書き留めていきます

初Instruments

InstrumentsのAllocationsを使ってメモリリークを調査してみた。手順は以下。
まず下記記事を参考に設定。
二重解放 (double free) や 解放済みオブジェクトへのアクセス (EXC_BAD_ACCESS) によるクラッシュを Instruments を使って調べる - 24/7 twenty-four seven
Allocationsを実行してリークしているオブジェクトのHistoryを表示させたらResponsible Callerでソートしてretainした数とreleaseした数が一致してないCallerを探す。
そのCallerの中で原因っぽいコードを探す。


メモリリークの原因はblocksのなかでselfを参照していたため、循環参照になってしまっていたことだった。
下記記事を参考に__weakを使って循環参照をなくした。
iOSコーディングスタイルを変えてしまうBlocksKitの紹介 - 中継地点


以下はまったポイント。
メモリリークの原因を修正した後、AllocationsのRecordを開始したが実行結果が修正前と同じだった
Record開始時に自動でビルドしてくれないので、修正前のプログラムを実行していたことが原因。
コードを修正したらいったんビルドしてからRecordを開始しないといけない。


・参照カウントが0なのにメモリが解放されない
下記質問と同じ現象だった。
objective c - Object with reference count equals to 0 is still persistent - Stack Overflow
原因はEnable NSZombie DetectionをONにしていたこと。
これをONにしてるとすべてのメモリが解放されない。