準公式(?)イベントハンドラを無名メソッドで書く方法。
リンク先の記事でやってることは前書いたのとほぼ同じなんだけど、そこはかとなくあちらの方が華麗なコードぽくて悔しいです>< ただ、参照カウントの問題も同じく解決されてなかったので、どちらの方法を使っても無名メソッドのおいしさを100%味わうことはできない。「もうやめて!(親関数のスコープを抜けたら)無名メソッドの実体はnilよ!」状態。まぁnilでもないんだけど。
で、YT先生が言ってるように、_AddRefしちゃえばオブジェクトの寿命の問題はとりあえず解決するんだけど、問題はどこで解放するか…。
var AnonMethods: TInterfaceList; // 先日の関数 function MakeNotifyEventHandler(const Proc: TNotifyEventProc): TNotifyEvent; var method: TMethod; begin AnonMethods.Add(IInterface(Proc)); // Addにより参照増やす&後で解放するためだけにリストに追加 ... end; ... initialization AnonMethods := TInterfaceList.Create; finalization AnonMethods.Free;
こうしておけば解放の問題も片付くけど、どうも釈然としないなぁ。上記の方法でも、単に_Addrefだけしておく方法でも、どちらも結局終了時までオブジェクトが生き残ってるんだから、自分で解放するかOSにやらせるかの違いしかないわけだし。やはりここはハンサムのポルナレフを待つしかなさそう。