GC時に呼ばれるフックを探す
COM interface released by finalization: an IDispatchPointer {0161A070}
というエラーが出ていたので、finalization:メソッドを検索するがヒットせず。
Objectクラスをブラウズするとfinalizationカテゴリがあり中にfinalizeメソッドを発見
finalize "Finalize the object. This message is sent by WeakDictionary. The default is to do nothing. Subclasses might want to override this method." ^self
というわけでfinalizeメソッドで検索し直し
すると、IDispatchPointerの親クラスであるCOMInterfacePointerクラスにfinalizeメソッドがあった。
finalize "The receiver is no longer referenced by any object in the system and is about to be destroyed. Release the interface reference. " self isValid ifTrue: [COMDevelopmentWarning raiseSignal: (#ErrNamedInterfaceReleased << #com >> 'COM interface released by finalization: <1p>' expandMacrosWith: self)]. "ifFalse: [ COMDevelopmentWarning raiseSignal: 'Unnecessary finalization on COM interface ', self printString ]" ^self release
raiseSignal:の引数的にこのメソッドが呼ばれていると見て良さそうだが念のため確認。
このメソッド定義の先頭にself halt.を入れると、Warningの代わりにデバッガが立ち上がってくるので、このfinalizeメソッドが呼ばれていること確定。
他の言語の場合
squeakでも同じfinalizeだった。Smalltalk時代から変わってないところなのかも。
Javaでも同じfinalize()だった。
Object (Java Platform SE 6)
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Object.html#finalize()
このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。サブクラスは finalize メソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを行ったりすることができます。
Rubyの場合はファイナライズ用のプロトコル名が決まっているわけではなく、その都度procを登録する方式
一方、Ruby の場合、もうちょっと話が複雑になります。ファイナライザの定 義には、ObjectSpace のモジュール関数である define_finalizer(obj, proc) を用います。obj がファイナライズの対象となるオブジェクト、proc がその オブジェクトに適用するファイナライザとなります。
http://www.jitu.org/~tko/doc-jp/java-ruby/java-ruby-lang.html
だめだった
Regexpクラスに以下のようなfinalizeメソッドを定義した。
finalize re release. self halt
が、デバッガが起動する前にwarningが出てしまう。
普通のオブジェクトのGCは結構後回しにされてるが、IDispatchPointerオブジェクトはWeakArray outerFinalizationLoopという処理で即座にGCされている感じ。
WeakReference & Finalization (Smalltalk Textbook 48)
http://www.sra.co.jp/people/aoki/SmalltalkTextbookJ/textbook48.html
WeakReferenceは、参照しているオブジェクトをしっかりと捕まえていないので(StrongReferenceではないので)、どこかでそのオブジェクトをしっかりと(StrongReferenceで)捕まえていたはずの別のオブジェクトが見切りをつけたFinalizationの時点で、WeakReferenceで参照されているオブジェクトも自動的に見切りがつけられるという大変に便利なメカニズムです。