![]() |
![]() |
![]() |
さて今回は、割り当てられたオブジェクトは、いつ解放されるのか、またどのように解放すればよいのかを考えてみたいと思います。この解放の枠組みを明確にした点が、Foundation Kitの成果の一つでした。それは、解放のタイミングはプログラマによって決められるべきという視点からの明確なポリシーとして提供されています。JavaのようにGCに頼るのはたしかに楽なのですが、GCの実行負荷という欠点もあるのです。メモリの有効利用という点からも、GC方式は難がある場合があります。かといって、無条件に解放していたら、難しいバグの温床にもなりかねません。そこで、Cocoaでは、保持と解除という簡単で明快なポリシーを提供しました。
そのポリシーを一言で言うなら、保持数カウント法とも言えるものです。JavaのGCが参照をカウントしているのに対して、非常にプログラマサイドの方法です。保持数カウント法は、各オブジェクトが保持された回数を管理していて、保持(retain)するとカウントが+1されます。逆に解除する(release)とカウントが-1されます。で、カウントが0になった時点で解放される(dealloc)という仕組みです。この仕組みを実現するために、NSObjectでは、以下のようなインスタンスメソッドが提供されています。
- (id)retain - (oneway void)release |
これらのメソッドを使う上で、知っておかなければならない重要事項が以下の諸点です。これを忘れると、メモリリークの原因になります。
さらに、メモリリークを防ぐには、以下の点に気をつけます。
これらのメソッドを使用した例を以下に示します。
- (void)foo
{
id obj = [[Foo alloc] init];//保持数 1
[obj retain]; //保持数 2
[obj release]; //保持数 1
[obj release]; //保持数 0 で解放。以降、objは無効なオブジェクト
}
|
オブジェクトが保持されている数を得るために、NSObjectでは、以下のようなインスタンスメソッドが提供されています。
- (unsigned)retainCount |
![]() |
![]() |
![]() |