iphone、またはiPadアプリの開発にて無視できないのがメモリ対策。
昔に比べると、開発者はARC (Automatic Reference Counting)の導入以降、手作業でのメモリ管理からある程度解放されました。
ただ、ARCは万能ではなく、メモリ問題には落とし穴があったりします。
現に私が開発しているiOSのプロジェクトでもメモリ問題は度々発生します。
そこで今回は実際に私がサービスを開発、運用しているプロジェクトを例にして、メモリ管理、特にメモリリークの調査方法を紹介していきます。
前提として以下の環境にて動作を確認しています。
OS : MacOS Sierra 10.12.6
Xcode :9.0.1
Instruments : 9.0.1
XcodeのInstruments
iOSアプリの開発環境であるXcodeにはInstrumentsというツールが付属されています。
InstrumentsはアプリのCPUやメモリ使用量、メモリリークの情報をリアルタイムにモニタリングできるツールです。
Instrumentsの起動はXcodeから起動するのが便利です。
Xcodeが起動している状態で画面上のメニューから
Xcode>Open Developer Tool>Instruments
Instrumentsが起動したら、下のようなウィンドウが開きます。
アイコンが並んでいますが、その中から「Time Profiler」をクリックします。
するとTime Profilerの画面が開きます。
AllocationsとLeaks
この状態ではCPUのみの表示となるため、メモリ関連の「Allocations」と「Leaks」をモニタ対象として追加します。
ウィンドウの右上にある「+」から選べます。
準備ができたらウィンドウ左上の赤い丸ボタンをクリックするか「command+R」を押します。
この時、モニタしたい対象のアプリを起動できる状態にしておく必要があります。
するとCPU、ヒープメモリ、メモリリークの状況がリアルタイムに表示されます。
ここからはアプリを普通に操作していき、メモリリークの状態を見ていきます。
アプリを起動した直後の状態です。
今回はわかりやすくするために、わざとリークするようにしています。
Leak Checksの行に赤い✖️が付いているところがメモリリークしている箇所です。
画面下半分にはメモリリークが発生しているクラス、アドレス、サイズが表示されます。
ヒープメモリと合わせてみるとよりわかりやすいかと思います。
実際にメモリリークを発生させてみる
試しにNSMutableArrayのオブジェクトを繰り返し生成し、解放しないでおきます。
メモリがリークし、メモリ使用率が右肩上がりとなりました。
Allocationsの赤枠で囲っている部分です。
メモリリークの詳細は「Leak Checks」の行を選択すると画面下半分に表示されます。
今度はNSMutableArrayのオブジェクトを解放してやります。
メモリ使用率が上がったり下がったりを繰り返しています。
きちんと解放されていることが確認できますね。
このように、AllocationsとLeaksを組み合わせれば、アプリ上でのメモリ使用率の変化を把握でき、メモリリークしている場合は、該当箇所を特定できます。
最低でもアプリが完成した際、または定期的にアプリのメモリ使用状況を確認しておいたほうがいいです。