From: Kouhei S. <ko...@co...> - 2006-03-18 09:41:21
|
須藤です. In <200...@co...> "[ruby-gnome2-devel-ja] signal_connectしたハンドラは自動で削除してくれない?" on Tue, 07 Mar 2006 21:10:10 +0900 (JST), Kouhei Sutou <ko...@co...> wrote: > 現在,GLib::Object#signal_connectで登録したハンドラは自分で > 削除しないと削除されないようです. > このため, > > object.signal_connect("XXX") do > ... > end > > というようにハンドラを登録すると,ハンドラがobjectの参照を持っ > たまま生き残ってしまい,objectがGCされません. グローバルなテーブルにハンドラを登録していたのを各オブジェク トにハンドラを登録するようにして直してみました. ただ,このためにひとつAPIを追加しました.オブジェクトにハン ドラを登録するg_rclosure_attachです.g_rclosure_newでハンド ラを作ったら,ハンドラを登録するオブジェクトに登録しなければ いけなくなりました. # g_rclosure_newにオブジェクトを渡してもよかったのですが, # ハンドラの作成とハンドラの登録は別処理かなぁと思ったので. このため,Ruby/GTK2のrbgtkaccelgroup.cとRuby/GNOME2の rbgnome-app-helper.cも変更しました. 今回の修正は,↓のテストスクリプトやgtk-demo/main.rb,Rabbit が正常に動くのを確認しました. > require 'glib2' > > def x(disconnect) > o = GLib::Object.new > id = o.signal_connect("notify") {} > o.signal_handler_disconnect(id) if disconnect > nil > end > > [true, false].each do |disconnect| > GC.disable > 100.times {x(disconnect)} > p [disconnect, :before, ObjectSpace.each_object(GLib::Object){}] > GC.enable > GC.start > p [disconnect, :after, ObjectSpace.each_object(GLib::Object){}] > end > > このスクリプトを実行するとこうなるはずです. > > [true, :before, 100] > [true, :after, 0] > [false, :before, 100] > [false, :after, 100] |