微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/delphi/103260.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐