Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What is going on with this article?

More than 5 years have passed since last update.

@siba

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

今更、非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のお試し利用と、自分用メモ兼ねて。
そのうちまとめ直して画像付きとか凝ってみてもいいのかも。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
16
Help us understand the problem. What is going on with this article?