2011年2月9日水曜日

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

自動開放プールの使い方に関してですが、自動開放プールを複数定義することで、任意の範囲でメモリの開放を制御する事が出来ます。実際の使い方としては、あるループ内で必要な処理を行い、ループ毎にメモリの取得・開放を行いたい場合は以下のようなサンプルになるかと思います。メイン関数ではプログラムの開始と終了で自動開放プールを宣言し、whileループ内ではループの頭に自動開放プールを宣言し、ループを抜ける最にリリースを行っています。このように複数の自動開放プールを定義することで、必要な範囲で自動開放プールを利用することが可能です。

/***********/
/* 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];
 
    int index=5;
    while (index-- > 0) {
        //ループ毎の自動開放プールを宣言
        id rpw = [[NSAutoreleasePool alloc] init];
        id a = [[A alloc] init];
        //自動開放プールに登録。このメモリはwhileループ毎に開放される
        [a autorelease];
 
        //ループ単位で自動開放プールの開放を行う。
         [rpw release];
    }

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

以下、実行結果。ループに入る前に生成した1つとループ内で生成した5つのインスタンスが正しく解放されています。

I'm released.
I'm released.
I'm released.
I'm released.
I'm released.
I'm released.

0 件のコメント :

コメントを投稿