2008-06-24

[ヒレガス本]Chapter 4. Memory Management #2

前回より続き。

p.70
配列(NSMutableArray)にオブジェクトが追加されるときにオブジェクトはコピーされない。配列中に保持されるのはオブジェクトへのポインタ。で、そのとき追加されるオブジェクトに retain が送られる。配列が削除(deallocate)されるときに、格納されていた各オブジェクト(へのポインタ)に release が送られる。同様に、配列から要素(オブジェクト)が取り除かれるときにもオブジェクトに release が送られる。

Releaseに関する規則 (p.73)

  • alloc, new, copy および mutableCopy で作られたオブジェクトは retain count が 1 になっていて、autorelease pool には登録されていない。
  • 他のメソッドで作られたオブジェクトは、autorelease されている(retain count が 1)。deallocate されたくないときは retain する必要がある。

アクセサ

他のオブジェクトを保持するインスタンス変数があったとして、その setter をどう書くか。setter に今保持しているのと同じオブジェクトが渡される可能性に対応するため、以下のように書く必要がある。

- (void)setFoo:(NSCalendarDate *)x
{
    [x retain];
    [foo release];
    foo = x;
}

この方法以外にも、release と代入の前に(同じオブジェクトかどうかを)チェックする、あるいは release の代わりに autorelease を使う、というのもある。3つのどれでも良いけれど(それぞれにトレードオフがある)、この本では最初の「retain して release」を選ぶ、と。

これで終わり!!

Objective-C に関する説明はここまで。残りは Cocoa フレームワークに関する話題が中心になる、とのこと。(p.77)

0 件のコメント:

コメントを投稿