delphi – “弱参考”:需要地下解释

有人可以在Delphi中提供弱参考的解释吗?

我注意到这个概念在我仔细研究的一些图书馆/框架的源代码中经常被提到。我陷入困境,希望对此有明确的了解。

解决方法

通过接口引用引用的实例在基于引用计数的接口实现中保持彼此。

一个弱参考用来打破“保持彼此活着”熊的拥抱。这是通过将一个引用声明为纯指针来规避引用计数机制来完成的。

IFriend = Interface(IInterface)
end;

TFriend = class(TInterfacedobject,IFriend)
private
  FFriend: IFriend;
end;


var
  Peter: IFriend;
  John: IFriend;
begin
  Peter := TFriend.Create;
  John := TFriend.Create;

  Peter.Friend := John;
  John.Friend := Peter;
end;

即使彼得和约翰超出范围,他们的实例也是保持在一起的,因为他们的相互参考使得他们的计数不会下降到零。

该问题在复合模式(父 – 子关系)中更常见,其中小孩具有对父项的反向引用:

ISomething = Interface(IInterface)
end;

TSomething = class(TInterfacedobject,ISomething)
end;

TParent = class(TSomething)
  FChildren: TInterfacedList;
end;

TChild = class(TSomething)
  FParent: ISomething;
end;

同样,父母和孩子可以保持彼此相邻,因为他们的相互参考使得他们的计数不会下降到零。

这是通过弱参考来解决的:

TChild = class(TSomething)
  FParent: Pointer;
end;

通过将FParent声明为“纯”指针,引用计数机制不会对父对方的引用起作用。当父母超出范围时,其引用计数现在可以下降到零,因为它的孩子不再保持其引用计数高于零。

注意此解决方案需要仔细注意终身管理。在这些班级的“外部”上的某些东西保留对孩子的提及时,儿童可以在父母的生命之后活着。而当孩子承担父参考总是指向一个有效的实例时,这可以导致各种有趣的AV。如果你需要它,确保父母超出范围时,它使得孩子没有返回引用,因为它没有自己的引用给它的孩子。

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...