ひ日誌
2006-06-13 ( ja -> en )
_ [rubycocoa][ruby][objective-c] GC対応の仕組み
おととい、酒井さんから「RubyCocoaはGCどうしてるの?」と聞かれたのだけど、あまりまともに答えられなかったので、ここに整理して書きます。
まず、Cocoaでのメモリ管理について。Cocoaでは、Objective-Cのオブジェクト(以下OBJCオブジェクト)のメモリ割当を参照カウンタで管理しています:
[rcv retain]; // rcv の所有権を獲得 ... [rcv release]; // rcv の所有権を放棄 free if 所有者=0
RubyCocoaでは、OBJCオブジェクトを所有する目的のRubyのクラスがあります。そのRubyクラスのインスタンス(=Rubyオブジェクト)用のメモリ割当時に、所有するOBJCオブジェクトの「所有権を獲得」します。そして、GCがそのRubyオブジェクトのメモリを解放するときに、所有するOBJCオブジェクトの「所有権を放棄」します。
というのが、僕がRubyCocoaを書いたときのGC対応に関する基本的な考え方です。実際には、生成されるタイミングやなんかの都合で、もうちょっとややこしいことになってたような気がします。正直なところ、自分でもかなり忘れてます。
いずれ本流に取り込まれる予定の apple-unstable ブランチでは、そのあたりをいろいろと変えてる(改良してる)らしいのですが、commiterさんたち(Laurentさんやkimuraさん)にまかせっきりで、どんな変更かまだ理解してない状態なので、ここで細かいツッコミが入った場合、おそらく、僕にはすぐ答えられません(ごめん)。
だけど、これを書いていて少し思い出してきました。なんかちょっと調子でてきたかも。apple-untableのソースなども追々読んでみます。
(追記 2006.6.13 12:50) と書いてから気付いたのだけど、上に書いた説明だと、設計的によくないような気がしてきました。僕が実装してた時点(2001-2003あたり)では、Ruby側に関して、おそらく、メモリ割当と初期化をごっちゃに考えていました。いろんなパターンがあってややこしかったことだけは覚えてるのだけど…
RubyオブジェクトがOBJCオブジェクトを所有するべきタイミングは、基本的には、Rubyオブジェクトの「メモリ割当時」ではなくて「初期化時」であるべきだろう。ということに今さっき気付きました。解放に関しても同様。ひょっとすると apple-untable のメモリ割当に関する修正はそのあたりのことかも(ほんとにあとで読む)。