From: Masao M. <mu...@hi...> - 2006-10-13 17:36:22
|
むとうです。 On Fri, 13 Oct 2006 09:55:58 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > 06/10/13 に Masao Mutoh<mu...@hi...> さんは書きました: > > > 今日、libglade2.rbに当てられたパッチですが、 > > これの意図についてです。 > > > > @sources ||= {} > > @sources[source.object_id] = source > > source.signal_connect("destroy") do |object| > > @sources.delete(object.object_id) > > end > > > > この部分だけみると、確かに問題の回避はできてると > > 思うのですが、これって要は > > > > 1. グローバル(といってもGladeXMLクラスの内部)な領域に > > ウィジェットを保持。GCを避ける > > 2. destroyイベントのタイミングでオブジェクトを削除。 > > その後、GC対象となる > > > > ということをしてるんですよね。 > > はい,そうです. > > > これって、libglade2だけの問題ですか? > > だと思います. > > > ぱっと見たところ、GLib::Objectのインスタンスなら全てが > > 該当しそうな気がしたので質問させて頂きました。 > > GLib::Objectだと(たぶん)プロパティ内のオブジェクトが全て > マークされるのでGCされません.(さかいさんがこういうことを > やってくれたのだと思っています.) > > しかし,GladeXMLはプロパティとして.gladeから作られたウィ > ジェットをもっていないので,↑の仕組みではGCから保護されま > せん.ということで,明示的にオブジェクトの参照を持っておい > てGCから保護するようにしました。 なるほど・・・。 ちなみにGladeXMLオブジェクト自体が先に解放されても大丈夫でしょうか? > 本当は.glade内にあるトップレベルの全てのウィジェットを持てば > よいと思いますが,そういうAPIが公開されていないようだったの > で,必要最小限ということで,signal_connectされたオブジェクト > だけ参照を持っておくようにしました. GladeXML#widget_namesでウィジェット名が取れるので、 @glade.widget_names.each do |name| @source[name] << @glade[name] end みたいな感じでしたらいけるかも・・・。 あ、でもトップレベルって訳じゃないか。 -- .:% Masao Mutoh<mu...@hi...> |