17
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

非ARC環境におけるObjective-Cのメモリリークチェック

Posted at

今更、非ARC環境についてあまり考えても仕方ないのだが、そういうアプリもあるわけで。
メモリリークのチェックについて、いろいろ確認を。

Xcodeにおいてメモリリーク等のチェックに主に使うのはAnalayzeとInstruments(Leaks)

どちらも単純なメモリリークについては見つけてくれるのだが
allocした関数内で完結しない(retain増えるような別クラスに渡すとか)すると見つけてくれない(らしい)

そうなってくると難しいのがメモリリークしていないことの確認。
単純にInstrumentsのAllocations眺めてても結構変動するので
今回手を入れた個所がおかしいのか元々なのか
そもそも問題あるのかどうかすら、イマイチわからない。

なので、とりあえず、勉強がてらInstrumentsのAllocationsで見るべきポイントを絞ってみた。
・Statisticsの#Persistent
 これが確保されたままとなっている領域で、これが増え続けるようだとまずい。
・Allocation List
 そもそも怪しい領域の目星がついているのなら
 NSLog(@"%p", str)とかでアドレスをConsoleに出しておいて
 Allocation List検索して様子を探れる。
 メモリが確保された呼出し元の関数も検索対象にできるようで
 自作の関数が乗ってたりするケースもあり、便利。
 参照カウントの増減履歴なんかも見れたり。
・DetailにあるGeneration Analysis欄のMark Generation
 Markした時間のAllocationsで監視している内容を保持して
 次のMarkをしたときに前回からどれだけ#Persistentが増えたかとか出してくれるみたい。便利。
 Markした横の矢印で中に入ると前回から今回までの時間帯の情報に絞ってくれるので
 Allocation Listで対象絞ったりも多少楽かも。

公式のマニュアルにはMark Generation使い方として
同じ動作何回かしてみて増え続けないことを確認とあるのだが
UIAlertController表示を繰り返すだけでも増減0にならなかったり。
多少の変動は気にしなくていいのかも。

最後に触っててちょっと罠かなと思ったのが
・LeaksのAutomatic Snapshotting
 あまりに早いと解析しっぱなしになってしまって、メモリリーク解析されない。。
 デフォルトの10秒ぐらいで見ておけばいいっぽい。
・再生ボタンみたいなところからProfile起動する場合
 Buildし直したと見せかけて、シミュレーターのアプリは更新されていないらしい。
 普通に更新前のアプリが起動した。。

メモリリークは今後も調べたりありそうなので、もう少し詰めてみてもいいかもしれない。
Swiftで開発してもチェックはするのだろうし。
今回触れなかったけど、Trace Symbolとか便利そうだった。

とりあえず、Qiitaのお試し利用と、自分用メモ兼ねて。
そのうちまとめ直して画像付きとか凝ってみてもいいのかも。

17
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?