Objective-CにはGCがないのか
メモリ管理
初期のObjective-CプログラムはC同様単純な割当と解放を行なっていたが、現在はライブラリレベルで参照カウントを行なうのが一般的。 OPENSTEPライブラリはイベントサイクル単位でAutorelease poolと呼ばれる暗黙の参照元を持っており、オブジェクトをここに登録することで事実上の自動解放オブジェクトを実現している。
今後はガベージコレクションに徐々に移行すると見られている。ただし両方式は一長一短があるという見方が支配的で、今後も併用される可能性が高い。GNU版ランタイムは独自に Boehm GCを使ったGCモードをすでに実現している。Apple版はMac OS X 10.5でGCを導入した。iPhoneのCocoa touchではリソース制限が厳しいことからGCは使われず、Autorelease方式を採用している。
Objective-CにはGCがないのか(2.0からは追加されるみたいだけど)。GCのない言語はちゃんと使ったことがないから独自のノウハウとかありそうだなー。いや、Mac持ってないし使う気はないんだけどさ。
ところで、とあるJavaのフレームワークで独自にオブジェクト破棄の仕組みを入れていたヤツがあったな。具体的には、独自のファイナライザを定義したクラス(インターフェイスだったかも)があって、
/** * フレームワークで使うクラスの共通基底クラス。 * (確かフレームワーク名を冠していたはず。) */ public class XObject { /** * オブジェクトを破棄する。 * インスタンス内で保持しているオブジェクトも破棄すること。 */ void destroy() {} }
この上で以下のルールを守ってコーディングすることで、確実にインスタンスの破棄が行なわれるようにする、という仕組み。(だったはず)
- フレームワークで使うすべてのクラスは、XObjectを派生する。
- XObjectが不要になった場合、必ずdestroy()を呼び出す。
「Javaのファイナライザはちゃんと呼び出される保証がない」のでこういう仕組みを用意したという話を聞いた覚えがある。フレームワークではこれを使ったインスタンス管理の機能が実装されていて、参照カウンタを使ったメモリリーク検出とかやっていたような(気がする)。
まぁ、気持ちはわからないでもないけど、必ずdestroy()を呼び出すとかいうルールはどう考えてもめんどくさいよなー。とはいえ、だいぶ前の話だし、フレームワーク自体はまだ使われているはずなので、そろそろGCとか実装されてるのかもな。