From: Kouhei S. <ko...@co...> - 2006-10-14 04:26:09
|
須藤です. 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内にあるトップレベルの全てのウィジェットを持てば > > よいと思いますが,そういう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オブジェクト内に持たせるよりも,どこ か別の場所に持たせた方がよいでしょうか? |