From: Kouhei S. <ko...@co...> - 2006-10-13 00:56:00
|
須藤です. 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から保護するようにしました。 本当は.glade内にあるトップレベルの全てのウィジェットを持てば よいと思いますが,そういうAPIが公開されていないようだったの で,必要最小限ということで,signal_connectされたオブジェクト だけ参照を持っておくようにしました. |