2012年11月17日土曜日

メモリ管理について個人的なまとめ2

前回の続きでメモリ管理についてまとめます。今回はNSAutoreleasePoolについて。

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 - こたつつきみかん

関連記事

NSAutoReleasePoolの作成&解放タイミングについて - togetter

0 件のコメント:

コメントを投稿