Xcode4でメモリーリークを検出する手順
メモリーリーク
Xcode4でメモリーリークをチェックするには、実行中の各種状態を可視化できるinstrumentsというツールのメモリリーク画面で確認することができます。(instrumentを起動してみるにはProduct>Profileを選択してください)
Xcodeの左上Runボタンを長押しすると"Run","Test","Profile","Analyze"のうちどのモードで実行するか選択できますので、"Profile"を選択します。(実行ボタンがプロファイルのアイコンに変わります。)
次に、Product>Edit Scheme>Profile ObjectiveC>Info>Build Configuration:ここでは"Debug"にしておきます
Executable:実行ファイル(デフォルトでは自動選択されている)
Instrument:実行時に起動したいinstrumentの種類を聞く場合"Ask onLaunch"
メモリリーク画面を直接表示したい場合→"Leaks"を選択して"OK"を押します。
先ほど変更した左上の実行ボタンを押すか、Product>Profileを押すとinstrumentsが起動して、メモリーリークをリアルタイムにチェックできるようになります。
instruments>Leaks>Snapshots(左側メニュー最上位)>SnapshotInterval(sec):ここでは仮に1.0secにしておきます。
Snapshotを押すと現在の状態がグラフに反映されます。
instrument上でRecordを押すと再度実行されて実行結果が蓄積されます。InstrumentのView>Run Browser
で実行結果の履歴を編集することができます。
サンプル
故意にメモリーリークを発生させてみて確かめてみます。下の例ではallocを呼び出してreleaseしていません。
main.m
#import <Foundation/Foundation.h> @interface Sample : NSObject @end @implementation Sample -(void) dealloc { NSLog(@"dealoc was called" ); [super dealloc]; } @end static void checkMemoryLeak(); void checkMemoryLeak(){ Sample *obj = [[Sample alloc]init]; // 解放しない } int main (int argc, const char * argv[]) { checkMemoryLeak(); [NSThread sleepForTimeInterval:3]; // 3秒スリープする return 0; }
実行するとinstrumentが起動して、1s後にMemory Leak Discoveredの項目にオレンジ色のマークが表示され、メモリーリークが検出されたことが分かります。そして右下側"Leaked Object"欄に、メモリーリークの元となったオブジェクト"Sample"が表示されています。
リークサイズ
Leaked Object欄を見るとオブジェクトの先頭アドレスとリークしたサイズが表示されています。メンバを全く持っていないオブジェクトでも16Bytesメモリ領域が確保されているということですね。そこで、試しに余分に16バイトだけクラスにデータを持たせて再度実行すると今度は32Bytesと表示されていることが分かります。
@interface Sample : NSObject { char buffer[16]; } @end @implementation Sample -(void) dealloc { NSLog(@"dealoc was called" ); [super dealloc]; } @end