自分の興味の赴くままにIT技術系のネタを取りとめもなくメモっています。
Ruby言語やLinuxのネタが多いです。
Ruby言語やLinuxのネタが多いです。
March 25, 2004 [おもひで]
■ [Ruby-GNOME2] GC + Gtk::Widget#destroy
MLで指摘されたんだけど、ウィジェットはいつGCの対象になるべきなのだろう。
require 'gtk2'
class Test
def hoge
win = Gtk::Window.new.show_all
nil
end
end
Gtk.init
Test.new.hoge
GC.start
Gtk.main
■ ここで、winはローカル変数なんだから、hogeを呼び出した後で(ウィジェット自体)GCされるべきじゃないの、というのが指摘内容。RubyのオブジェクトとしてはGCされるのかもしれないのだけどウインドウは表示されたままだ。
Rubyオブジェクトの生死のスコープと完全に一致させる必要があるなら、このタイミングでウィジェット自体を破壊(Gtk::Widget#destroyを内部的に呼び出す)してあげないといけないのかもしれない。
でも、それはそれでいろいろ問題ありそうだなー。

そもそも変数のスコープとオブジェクトのスコープは別物です。<br>ウィジェットに対応するオブジェクトは、Window Systemから<br>(ウィジェットを介して)参照されていると考えるのが自然では。
オブジェクトとはRubyのオブジェクト(インスタンス)って意味ですよね。<br>ファイルアクセス(openとcloseをする必要がある)みたいなのをイメージしたのですけど、そんな感じですかねー。
「openとcloseをする必要がある」に対応するのは「new.show_allとdestroyをする必要がある」でしょう。<br>show_allがブロックを受け付けるようにして、最後にdestroyするとか?
そうですねぇ。その場合、実際はshow_allではなく、newでブロック作るようになるんでしょうけど、シグナルハンドラの中でdestroyを書いたりするのでちょっと気持ち悪いような...。でも慣れの問題なのかも。