retainとrelease
Objective-Cでは、retain(保持)とrelease(オーナシップの解除)といった参照カウンタな感じで
オブジェクト管理が行われている。(別のもあるけど
で、
困ったなあというのが、
NSMutableArray(変更可能な可変長配列)などに
addObjectした場合も、
[object retain]が自動的にされる。
id hoge = [Hoge alloc];
[hogeList addObject:hoge];
とすると、自身のカウンタで1、hogeListによるretainで2の参照カウンタを得る。
自分はコンストラクタの中でlistに追加するのが好きなので、
Foo -(id)init { id self = [super init]; [fooList addObject:self]; ... } Bar : Foo -(id)init { id self = [super init]; [barList addObject:self]; }
なんてことをしてる。
さて、[bar alloc]を解放するにはどうしたら良いのだ?
これらは継承関係にある以上、
参照カウンタは3になる。
自身による1、fooListによる1、barListによる1、
で、これを解放するためには
fooListとbarListからremoveObjectし、
自身でも[self release]しなければならない。
Foo -(void)free { [fooList removeObject:self]; } Bar -(void)free { [super free]; [barList removeObject:self]; }
のようなメソッドを用意することは可能だが、
これだと自身の1を削除できない。
[bar free];
[bar release];
ってしないと駄目なのか?
freeでselfを返して、
[[bar free] release];
でも良いけど、なんか違う気がする。