NSAutoreleasePool

Cocoaには、他の開発環境では見かけない、いくつかのユニークな仕組みが用意されています。例えば、Key Value Coding(キー値コーディング),NSNotificationCenterなどがあげられますが、今回は既にたびたび出てきているNSAutoreleasePoolについて紹介します。

NSAutoreleasePoolは、名前からわかるように自動解放プールを作成するクラスです。自動解放プールとは至って単純な仕組みで、自動解放プールに登録されたオブジェクトは、自動解放プールを解放したときと同時に、登録されたオブジェクトも解放される仕組みです。正確には、登録されたオブジェクトにreleaseメッセージが送られます。

//プール作成
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

//たくさんのオブジェクトを登録
id *anObject = [[NSObject alloc] init];
[pool addObject:anObject];

...

//プール破棄時に、登録したオブジェクトにreleaseが送信される
[pool release];

こんな風にして、自動解放プールに登録したオブジェクトは、自動解放プールを解放したときと同時に破棄されるようになります。

ただし、普通はこんな使い方をしません。Cocoaはもっと簡単にreleasepoolが使えるように工夫されています。まず、NSObjectに現在のreleasepoolに登録するメソッドが用意されているので、addObjectを使って登録する必要はありません。

[anObject autorelease];

autoreleaseがそのメソッドです。現在のreleasepoolとありますが、releasepoolはいくつも同時に生成することができ、一番最後に作成されたreleasepoolが、現在のreleasepoolとなります。

このブログをたびたびご覧になっている方ならわかると思いますが、いつもautoreleaseを使っているときは、そもそもNSAutoreleasePoolを生成なんてしていません。これは、Cocoaアプリケーションを作成すると、自動的にautoreleasepoolが作成されるためです。ここでいうCocoaアプリケーションとは、Xcodeの新規プロジェクトで作成したCocoa Applicationのことです。

- (void)action:(id)sender
{
    id anObject = [[[NSObject alloc] init] autorelease];
}

結果的に、このようにautoreleaseをいきなりオブジェクトに送信してautoreleasepoolに登録できる仕組みになっています。このCocoaアプリケーションでデフォルトに用意されているreleasepoolは、いつ生成されていつ解放されるかというと、イベントループが1回転するごとに生成,破棄されています。 あとは、確かCocoaアプリケーション起動したときに、アプリケーション終了時に破棄されるautoreleasepoolが1つ作成されていたはずです。

というわけで、NSAutoreleasePoolの紹介でした。次は、NSNotificationCenterでも紹介したいと思います。

コメント投稿