メモ。TInterfacedObjectとinterfaceの使い方。
TInterfacedObjectを継承し、interfaceで参照している場合、参照カウント方式で自動的にオブジェクトは開放される。
試したDelphiのバージョンはXE3。
interfaced_object.dpr
program interfaced_object; {$APPTYPE CONSOLE} type IFoo = interface procedure Say; end; TFoo = class(TInterfacedObject, IFoo) public procedure Say; end; procedure TFoo.Say; begin Writeln('Hello, world!'); end; var // TFooだと明示的な開放が必要 // IFooだと参照カウントで自動的に開放 Foo: IFoo; begin // 終了時にメモリリークをレポートする ReportMemoryLeaksOnShutdown := True; Foo := TFoo.Create; Foo.Say; // Freeを呼ばない end.
IFooで参照していることに注意する。TFooだと開放されずにメモリリークとして検出される。
明示的な開放が不要なのは楽だけど、プロパティが使えなかったりと少し不便。
functionでそれっぽく振舞わせてどうにかするか、参考ページのように参照カウント,開放周りをいじるかは必要になりそう。
実行結果
>dcc32 interfaced_object.dpr >interfaced_object.exe Hello, world!