加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 10:13:49 所属栏目:大数据 来源:网络整理
导读:有人可以在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。如果你需要它,确保父母超出范围时,它使得孩子没有返回引用,因为它没有自己的引用给它的孩子。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读