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