gpt4 book ai didi

delphi - "Weak reference": down to earth explanation needed

转载 作者:行者123 更新时间:2023-12-03 14:34:57 34 4
gpt4 key购买 nike

有人可以解释一下 Delphi 中的弱引用吗?

我注意到这个概念经常在我仔细检查的一些库/框架源代码中提到。我陷入了困境,想要对其有一个清晰的了解。

最佳答案

通过接口(interface)引用相互引用的实例在基于引用计数的接口(interface)实现中保持彼此的事件状态。

使用弱引用来打破“让彼此活下去”的熊抱。这是通过将一个引用声明为纯指针来规避引用计数机制来完成的。

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;

即使 Peter 和 John 超出范围,他们的实例也会保留,因为他们的相互引用可以防止他们的引用计数降至零。

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

ISomething = Interface(IInterface)
end;

TSomething = class(TInterfacedObject, ISomething)
end;

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

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

同样, parent 和 child 可以保持彼此在一起,因为他们的相互引用可以防止他们的引用计数降至零。

这是通过弱引用解决的:

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

通过将 FParent 声明为“纯”指针,引用计数机制不会对父级的反向引用起作用。当父级超出范围时,其引用计数现在可以降至零,因为其子级不再将其引用计数保持在零以上。

注意此解决方案确实需要仔细注意生命周期管理。当这些类的“外部”的某些东西保留对 child 的引用时, child 可以在 parent 的生命周期之外保持活力。当子进程假设父引用总是指向一个有效的实例时,这可能会导致各种有趣的反病毒。如果您需要它,请确保当父级超出范围时,它会先使子级将其后向引用归零,然后再将其自己对其子级的引用置空。

关于delphi - "Weak reference": down to earth explanation needed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11501029/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com