NSAutoreleasePoolはオブジェクトを自動的に解放してくれるプールを作成するクラスです。あまり使ったことがないのでメモ。
NSAutoreleasePoolの仕組み
対象のオブジェクトにautoreleaseメッセージを送信するとNSAutoreleasePoolというautoreleaseを管理するプールに入ります。そのプールを解放したときに、同時に登録されたオブジェクトにreleaseメッセージが送信され、オブジェクトが解放される仕組みになっています。
NSAutoreleasePoolを使ってみる
NSAutoreleasePoolには(たぶん)2種類の使い方があります。一つはプロジェクトを作成するとデフォルトで1つNSAutoreleasePoolオブジェクトが生成されるのでそれを使う場合と、もう一つは自作でNSAutoreleasePoolオブジェクトを生成する場合があります。デフォルトで生成されたNSAutoreleasePoolオブジェクト使う場合
使い方の例を以下に書きます。NSData *data = [[NSData alloc] init];
[data autorelease]; // dataとして参照されているオブジェクトをNSAutoreleasePoolに登録
生成したオブジェクトに対してautoreleseメッセージを送信しています。イベントループの終了と同時に、autoreleaseメッセージを送信されたオブジェクトは解放されます。
ですが、上の例のような単純なものではなく、イベントループ内でいくつも生成を繰り返す場合などはループを抜けるまでオブジェクトが解放されずに溜まっていってしまいます。その場合は以下のように自作でNSAutoreleasePoolオブジェクトを生成して管理するといいそうです。
自作で生成したNSAutoreleasePoolオブジェクトを使う場合
使い方の例を以下に書きます。NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // (1)
NSData *data1 = [[[NSData alloc] init]autorelease]; //autoreleaseメッセージ送信
NSData *data2 = [[[NSData alloc] init]autorelease]; //autoreleaseメッセージ送信
:
:
[pool release]; // (2)
(1)~(2)の間でautoreleaseメッセージが送信されたオブジェクトはNSAutoreleasePoolに登録(正確にはaddObject:メソッドが実行)され、NSAutoreleasePoolオブジェクト(今回は pool)がreleseされるとNSAutoreleasePoolに登録されたオブジェクトが一斉に解放されます。
まとめ
- プロジェクト作成時にNSAutoreleasePoolが一つ生成される
- autoreleaseメッセージが送られたオブジェクトはNSAutoreleasePoolにaddされる
- autoreleaseメッセージが送られたオブジェクトはイベントループの終了と同時に解放される
- NSAutoreleasePoolに登録されたオブジェクトはautoreleaseメッセージを送信しないとreleaseされない
参考記事
Cocoaのメモリ管理(3) - Cocoa倶楽部(仮称)NSAutoreleasePoolの動作について - 24/7 twenty-four seven
NSAutoreleasePool - こたつつきみかん
0 件のコメント:
コメントを投稿