問題は基本的にこれで、python の gobject と gtk バインディングにあります。構築時にシグナルにバインドするクラスがあるとします。
class ClipboardMonitor (object):
def __init__(self):
clip = gtk.clipboard_get(gtk.gdk.SELECTION_CLIPBOARD)
clip.connect("owner-change", self._clipboard_changed)
問題は、 ClipboardMonitor のインスタンスが死ぬことはないということです。gtk クリップボードはアプリケーション全体のオブジェクトであり、 callback を使用するため、それに接続するとオブジェクトへの参照が保持されますself._clipboard_changed
。
弱参照 (weakref モジュール) を使用してこれを回避する方法について議論していますが、まだ計画を立てていません。コールバックをシグナル登録に渡し、それを弱参照のように動作させる方法は誰でも知っています (ClipboardMonitor インスタンスがスコープ外にあるときにシグナル コールバックが呼び出された場合、それはノーオペレーションである必要があります)。
追加: GObject または GTK+ とは独立して言い回し:
弱参照セマンティクスを使用して、不透明なオブジェクトにコールバック メソッドをどのように提供しますか? 接続しているオブジェクトが範囲外になった場合は、削除する必要があり、コールバックはノーオペレーションとして機能する必要があります。接続先は、コネクタへの参照を保持してはなりません。
明確にするために:「デストラクタ/ファイナライザ」メソッドを呼び出す必要を明示的に避けたい