From: Masao M. <mu...@hi...> - 2006-10-14 12:24:28
|
むとうです。 On Sat, 14 Oct 2006 13:26:03 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 02:36:08 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > ちなみにGladeXMLオブジェクト自体が先に解放されても大丈夫でしょうか? > > こういうことでしょうか? > > glade = GladeXML.new(...) {...} > glade = nil > GC.start > > 大丈夫では無いです.クロージャもGCされます. なるほど・・・。 > 私はGladeのことはよくわからないのですが,GladeXMLはウィジェッ > トを作ったらすぐに開放するのが普通なのでしょうか? 普通はそんなことは無いですが、例えば複数のgladeファイルを1つのアプリケーション で使う場合など、可能性はあります。 > > > 本当は.glade内にあるトップレベルの全てのウィジェットを持てば > > > よいと思いますが,そういうAPIが公開されていないようだったの > > > で,必要最小限ということで,signal_connectされたオブジェクト > > > だけ参照を持っておくようにしました. > > > > GladeXML#widget_namesでウィジェット名が取れるので、 > > > > @glade.widget_names.each do |name| > > @source[name] << @glade[name] > > end > > > > みたいな感じでしたらいけるかも・・・。 > > あ、でもトップレベルって訳じゃないか。 > > トップレベルのウィジェットもとれるのでこれでもよいと思います. > が,手元で少し試した感じだと,トップレベルのウィジェットだけ > 参照してもだめな気がします. > > 例えば,こんなときにハンドラがGCされてしまいます. > > トップレベルのウィジェット -> ... -> ハンドラを設定しているウィジェット > 子 子 > > 「トップレベルのウィジェット」の参照だけを持っていても,間の > 「...」のところにRubyのウィジェットがまだ存在しない(ことも > ある)ため,プロパティを辿ってマークしていっても,「ハンドラ > を設定しているウィジェット」がGCされ,結果的にハンドラもGCさ > れてしまいます. > > widget_namesを使って一度全てのウィジェットを取り出せば,間の > 「...」にもRubyのウィジェットができるので↑のようなことは起 > きなくなります.ただ,なんかもったいない気はします. > > ということで,今の「ハンドラを設定したウィジェットの参照をもっ > ておく」作戦が妥当じゃないかと思います. なるほど。確かに。 > ところで,「ハンドラを設定しているウィジェット」の参照を保持 > する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ > か別の場所に持たせた方がよいでしょうか? 可能性という意味では、先の例があげられますので、 グローバルに持たせた方が良いような気がします。 ではでは。 -- .:% Masao Mutoh<mu...@hi...> |