如果我在TMyForm = class(TForm, IMyInterface)
这样的表单上实现接口,当没有更多的接口引用时,该对象是否会自行释放?似乎没有,虽然我无法弄清楚如何计算TForm(如果有的话)。当接口引用超出范围时,我担心表单被释放,但这似乎不会发生。
我想这个问题有两个部分,首先是一个表格是否会被意外释放(真正的问题),其次是表格的引用计数。
答案 0 :(得分:13)
TForm
派生自TComponent
,它实现_AddRef()
和_Release()
以禁用对自身的引用计数。因此,任何TComponent
后代类实现的任何接口(如TForm
)在发布接口时都不会释放其实现TComponent
对象。
但是,如果为IVCLComObject
属性分配了TComponent.VCLCOMObject
接口,则TComponent
会将引用计数委托给该对象,以便在引用计数降至该对象时释放该对象。 0(TComponent
不会增加其IVCLCOMObject
引用的引用计数。
这适用于TComponent
的所有后代,除非他们通过手动覆盖_AddRef()
和_Release()
来实现对自己的任何引用计数。
答案 1 :(得分:0)
如果您在表单中实现接口,则值得添加您自己的
_Release as follows:
function _Release: Integer; stdcall;
function TMyInterfacedForm._Release: Integer;
begin
result:=-1;
end;
我发现可以使用接口释放表单,然后调用_Release作为局部变量超出范围。这可能会产生访问冲突,因为Tcomponent实现会检查是否设置了FVCLComObject
if FVCLComObject = nil then
Result := -1 // -1 indicates no reference counting is taking place
else
Result := IVCLComObject(FVCLComObject)._Release;
由于在此阶段,未定义FVCLComobject,可能会发生恼人的A / V异常。 通过硬连线-1,可以安全地调用它而不会触发异常。