2010年4月29日木曜日

Objective-Cにおけるオブジェクトの生成と解放(メモリ管理)

オブジェクト指向プログラムでは、生成するオブジェクトを解放しないでいると、メモリーリークを起こしてしまい、システムに影響を与えてしまうようです。
そのため、オブジェクトの生成と解放(メモリ管理)をプログラム側でしっかりとしてあげないといけないようです。

◆オブジェクトの生成(alloc メソッド)と初期化(init メソッド)
一般には、以下のコードで生成し、初期化します。
id obj = [ [objectType alloc ] init ];
オブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。

◆オブジェクトの保持(retain メソッド)
   オブジェクトを参照する場合、 他からの解放の危険を避けるため、明示的に保持(retain)を示すそうです。

この場合もオブジェクトのカウンターが+1されるため、不要となった時点でrelease(カウンターを−1)します。


◆オブジェクトの解放(releaseメソッド)
   オブジェクトの登録が解除され、使用できなくなります。
これらの状態は、retainCountとよばれる保持数として管理されており、オブジェクトが無くなると「0」になります。
- (void)method
{
id obj = [[ObjectType alloc] init];//保持数 1
[obj retain];           //保持数 2
[obj release];        //保持数 1
[obj release];       //保持数 0 ... 解放されており、これ以降objは使用できない。
}
さらに、リリースを容易とするため、autoreleaseメソッドも準備されており、そのオブジェクトをautoreleaseすることで、プログラムの終了時に一度に解放してくれる仕組みがあるそうです。
また、途中でNSAutoreleasepoolオブジェクトを生成し、そのオブジェクトreleaseすると、プログラム終了をまたずとも、その間autoreleaseしたオブジェクトを解放してくれるそうです。

◆オブジェクトの廃棄(deallocメソッド) <アプリから呼び出してはならない>
保持数が0となったオブジェクトは、deallocメソッドが暗黙的に呼ばれて解放されるようです。オブジェクト固有のインスタンス変数がある場合はは、deallocメソッドをオーバライドし、固有インスタンスの解放を含め実装するようです。
- (void)dealloc
{
[koyu_instans_var  release]; // 固有インスタンス変数を解除
[super dealloc]; // 親クラスのdeallocを実行
}

くわしくは、こちらか、Appleの「Cocoaメモリ管理プログラムガイド」を参照ください。
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article01.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article02.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article03.html
http://wwwa.dcns.ne.jp/~nito/CocoaClub/article04.html

0 件のコメント:

コメントを投稿