有人可以在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。如果你需要它,确保父母超出范围时,它使得孩子没有返回引用,因为它没有自己的引用给它的孩子。