delphi对象生命周期,接口重新赋值(简单问题)

dav*_*vid 1 delphi interface reference

众所周知(???),Delphi 对接口对象的接口引用进行引用计数,并在其引用计数降至零时销毁这些对象,通常是因为所有相关的接口变量都超出了范围。

假设我使用全局接口变量来引用持久对象:

type 
  tMySyncClass = class(TInterfacedObject,TmyInterface); ...  
  tMyAsyncClass = class(TInterfacedObject,TmyInterface); ...

var MyInterfaceVar : TmyInterface;

procedure MyProc();
begin
  MyInterfaceVar := tMySyncClass.create();
  ....
  MyInterfaceVar := tMyAsyncClass.create();
end
Run Code Online (Sandbox Code Playgroud)

调用 后MyProc,我有一个 的实例,并对其进行了tMyAsyncClass一个(全局)引用。MyInterface

我还有一个未引用的MySyncClass对象吗?重新分配是否会MyInterfaceVar触发第一个 ( SyncClass) 对象的销毁?

Rem*_*eau 5

将接口对象分配给接口变量将增加所分配对象的引用计数,并减少该变量先前引用的对象的引用计数。

所以,是的,重新分配MyInterfaceVar变量将删除对该tMySyncClass对象的引用,减少其引用计数,从而释放该对象,因为它没有更多的活动引用。