参照カウンタ方式だけど、カウンタの増減はプログラマが意識して行う必要がある・・・と言ったところかな。参照のコピーではカウンタ数は増加せず、retainメソッドを使用すると、参照カウンタの増加と所有権の取得(概念的なモノで動作には関わりなし?)が出来る。使い終わったら、releaseメソッドで参照カウンタの減少と所有権の放棄を行う。参照カウンタが0になったら即座に解放される・・・のかな?それに関する言及は見つからなかった気がする。
自動開放プール(Autorelease Pools)という機能があって、autoreleaseメソッドを使用するとこの自動開放プールにオブジェクトが登録される。あとは自動開放プールの有効範囲を抜ける際にreleaseメソッドが呼ばれる仕組み。その際に参照カウンタが0になったら解放される。おもしろいのは、この自動開放プールがスタック可能なこと。新しい自動開放プールを作成すると(スタックなので当たり前ではありますが)スタックの最上位に置かれ、以後のautoreleaseメソッドは新しい自動開放プールへの登録となる。多数のオブジェクトの作成と解放を行う処理の前に自動開放プールを作っておくと、そこで作成したオブジェクトだけ早めに解放できたりしそうですね。この機能がiPhoneで使えるのかは不明です。
C,C++のようにプログラマに全部任せるわけでもなく、Java,Rubyのようにプログラムが全部やってくれるわけでもない。どういう意図でこういう設計になったのか知りたい設計です。ガベージコレクタは重い処理なので、iPhoneでは使いにくいのは分かるんですが、Cocoa自体はMac OS Xでも使いますしねぇ。違和感はありますが、慣れてしまえば、プログラマは適切な位置で参照カウンタを更新するメソッドを呼ぶだけで良いので、楽そうではあります。