«前の日記(2006-06-12) 最新 次の日記(2006-06-14)» 編集
2002|09|
2003|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|10|11|
2008|01|

ひ日誌


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 のメモリ割当に関する修正はそのあたりのことかも(ほんとにあとで読む)。


«前の日記(2006-06-12) 最新 次の日記(2006-06-14)» 編集