Delphi的Interface机制来自于COM,使用了接口的对象,Delphi缺省采用引用计数对生命周期进行管理。
如果不希望Delphi来自动管理对象生命周期,我们可以将包含接口的对象继承自下面的对象(TIntObject)
type
TIntObject=class(TObject, IUnknown)
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
function _AddRef: Integer; stdcall;
function _Release: Integer; stdcall;
end;
function TIntObject.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
if GetInterface(IID, Obj) then
Result := 0
else
Result := E_NOINTERFACE;
end;
function TIntObject._AddRef: Integer;
begin
Result:=1;
end;
function TIntObject._Release: Integer;
begin
Result:=1;
end;
继承自TIntObject的对象就不会被Delphi的接口机制自动释放了。
使用自己管理生命周期的对象时有些情况也会出现内存访问异常。
例如:
type
TMyClass1=class(TIntObject, IOneInterface)
..