当没有更多的引用时,接口实现形式是否会自行释放?

时间:2013-12-04 21:47:30

标签: delphi interface tform

如果我在TMyForm = class(TForm, IMyInterface)这样的表单上实现接口,当没有更多的接口引用时,该对象是否会自行释放?似乎没有,虽然我无法弄清楚如何计算TForm(如果有的话)。当接口引用超出范围时,我担心表单被释放,但这似乎不会发生。

我想这个问题有两个部分,首先是一个表格是否会被意外释放(真正的问题),其次是表格的引用计数。

2 个答案:

答案 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,可以安全地调用它而不会触发异常。