2011年2月6日日曜日

Objective-C(自動開放プール)

iOS4で動作するObjective-Cではガベージコレクションがサポートされておらず、代わりにカウンタ管理方式を利用する必要があるのですが、生成したインスタンスすべてに対してreleaseメソッドを呼び出すのは面倒ですし、忘れてしまう可能性もあり使い勝手があまり良くないんじゃないかと。で、そんな時に利用するのが「自動開放プール」となります。

自動開放プールプールの簡単な使い方は以下です。

#import <Foundation/NSObject.h>
#import <Foundation/NSAutoreleasePool.h> //自動開放プール
#import <stdio.h>

/***********/
/* Class A */
/***********/
@interface A : NSObject {
}
- (void) dealloc;

@end

@implementation A
- (void) dealloc {
  printf("I'm released.\n");
  [super dealloc];
}

@end

/**********/
/* main   */
/**********/
int main(void) {
  //自動開放プールの生成
  id releasePool = [[NSAutoreleasePool alloc] init]; 
  A *aInstance = [[A alloc] init];
  //自動開放プールに登録
  [aInstance autorelease];

  //自動開放プールの開放。ここで登録した全てのインスタンスにreleaseメッセージが送信される。 
  [releasePool release];
  return 0;
}

以下、実行結果。
I'm released.

自動開放プールはNSAutoreleasePoolとして定義されています。使い方としては、NSAutoreleasePoolはインスタンス生成し、メモリの開放を行いたい所(たいていは何処かのスコープを抜ける所だと思いますが)で自動開放プールをreleaseすることで開放処理が行われます。
自動開放プールにインスタンスを登録するには、生成したインスタンスに対して「autorelease」メソッドを呼び出すことで登録を行います。autoreleaseメソッドはNSObjectに定義されています。

0 件のコメント :

コメントを投稿