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];

でも良いけど、なんか違う気がする。