当前位置: 首页 > news >正文

孝感网站建设孝感o2o 网站

孝感网站建设孝感,o2o 网站,php 网站开发平台,网站的导航页怎么做13.4 内存管理和接口 ​ 在第11章中,我介绍了接口的内存管理的关键要素。与对象不同,接口是受管理且具有引用计数。如我所提到的,接口引用会增加所引用对象的引用计数,但您可以声明接口引用为弱引用以禁用引用计数(但…

13.4 内存管理和接口

​ 在第11章中,我介绍了接口的内存管理的关键要素。与对象不同,接口是受管理且具有引用计数。如我所提到的,接口引用会增加所引用对象的引用计数,但您可以声明接口引用为弱引用以禁用引用计数(但仍然要求编译器为你管理引用),或者您可以使用unsafe修饰符完全禁用对特定引用的任何编译器支持。在这一节中,我们将深入探讨这个领域,展示一些在第11章中提供示例之外的额外示例。

13.4.1 关于弱引用的更多内容

​ Delphi 对接口使用的引用计数模型存在一个问题,即如果两个对象相互引用,它们将形成循环引用,并且它们的引用计数基本上永远不会降至零。弱引用提供了一种打破这些循环的机制,允许您定义一个不会增加引用计数的引用。

​ 假设两个接口使用它们的字段相互引用,而外部变量引用第一个接口。第一个对象的引用计数将为2(外部变量和第二个对象的字段),而第二个对象的引用计数为1(第一个对象的字段)。图13.4描述了这种情况。

图 13.4: 对象间的引用 对象之间的引用可以形成循环、 弱引用的原因

​ 现在,当外部变量退出作用域时,两个对象的引用计数为1;并且,由于拥有Object2的主对象Object1没有外部所有者,因此这两个对象将无限期保留在内存中。为解决这种情况,您应该打破循环引用,这是一件相当复杂的事情,因为您不知道何时执行此操作(应在最后一个外部引用超出范围时执行,但这是对象无法知道的事实)。

​ 解决这种情况以及许多类似情况的方法是使用弱引用。如前所述,弱引用是对对象的引用,不会增加其引用计数。从技术上讲,您通过对其应用[weak]attribute来定义弱引用。

注解: Attributes是第16章将介绍的Object Pascal高级语言功能。简而言之,它们是一种关于符号的添加一些运行时信息的方法,以便外部代码可以确定如何处理它。

​ 再考虑一下先前的场景,如果从第二个对象对第一个对象的引用是弱引用(见图13.5),那么当外部变量超出作用域时,两个对象都将被销毁。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

​ 让我们用代码来看看这种简单情况。首先,ArcExperiments 应用程序示例声明了两个接口,一个引用另一个:

typeIMySimpleInterface = interface['{B6AB548A-55A1-4D0F-A2C5-726733C33708}']procedure DoSomething(BRaise: Boolean = False);function RefCount: Integer;end;IMyComplexInterface = interface['{5E8F7B29-3270-44FC-B0FC-A69498DA4C20}']function GetSimple: IMySimpleInterface;function RefCount: Integer;end;

​ 程序的代码定义了两个实现这些接口的不同类。注意交叉引用(FOwnedByFSimple基于接口,其中一个被定义为弱引用):

typeTMySimpleClass = class(TInterfacedObject, IMySimpleInterface)private[Weak] FOwnedBy: IMyComplexInterface;publicconstructor Create(Owner: IMyComplexInterface);destructor Destroy; override;procedure DoSomething(BRaise: Boolean = False);function RefCount: Integer;end;TMyComplexClass = class(TInterfacedObject, IMyComplexInterface)privateFSimple: IMySimpleInterface;publicconstructor Create;destructor Destroy; override;function GetSimple: IMySimpleInterface;function RefCount: Integer;end;

​ 这个“complex”类的构造函数创建了另一个类的对象:

constructor TMyComplexClass.Create;
begininherited Create;FSimple := TMySimpleClass.Create(Self);
end;

​ 请记住,FOwnedBy字段是一个弱引用,因此它不会增加其引用对象的引用计数,在本例中,它不会增加 TMyComplexClass 的引用计数。在本例中是当前对象(Self)。鉴于此代码结构,我们可以编写:

class procedure TMyComplexClass.CreateOnly;
varMyComplex: IMyComplexInterface;
beginMyComplex := TMyComplexClass.Create;MyComplex.FSimple.DoSomething;
end;

​ 只要使用弱引用,这将不会导致内存泄漏。例如,使用以下代码:

varMyComplex: IMyComplexInterface;
beginMyComplex := TMyComplexClass.Create;Log('Complex = ' + MyComplex.RefCount.ToString);MyComplex.GetSimple.DoSomething(False);

​ 鉴于每个构造函数和析构函数都记录了其执行,您将得到一个类似于以下的日志:

kotlinCopy codeComplex class created
Simple class created
Complex = 1
Simple class doing something
Complex class destroyed
Simple class destroyed

​ 如果在代码中删除weak属性,你会看到一个内存泄漏,并且(在上面的代码执行中)引用计数为2而不是1。

http://www.yayakq.cn/news/937176/

相关文章:

  • 网站优化在百度网站备案查询上显示未备案是什么意思
  • 学网站开发要下载哪些软件有哪些建一个大网站需要的时间
  • 还没有做网站可以先备案域名吗电影网站怎么制作
  • 网站不备案怎么回事网站开发费用清单
  • 广州网站开发外包哪家好59做网站
  • 营销型网站九大特点查看网站后台登陆地址
  • 花钱做网站需要所有权网站建设有什么作用
  • 哪个旅游网站做的比较好网站开发个性化
  • 西安网站优化公司网站建设合同需要注意什么
  • 广州番禺网站制作mvc 网站 只列出目录
  • 淘宝客网站模板免费下载福州网站建设资讯
  • 网站做多个页面常州西站建设规划
  • 怎么做网站门户烟台做网站公司哪家好
  • 沈阳网页关键词优化广州seo团队
  • 各网站的风格及特点自费社保太坑了亏大了
  • 网站开发服务器知识wordpress 上传图片分类
  • 网站建设完成后交付方式上海注册公司能落户上海吗
  • 一个网站交互怎么做免费做微信请帖的网站
  • 软件下载网站建设短视频免费素材网站
  • 徐州网站开发如何如何做介绍监控公司的网站
  • 网站开发的四个高级阶段包括百度收录申请入口
  • 设计制作一个网站中国建站公司
  • 移动网站 拉新动物大联盟微信小程序入口
  • 茌平网站建设电话网站建设兼职劳务协议
  • 企业网站虚假宣称iso9001的处罚案例网站推广是做什么的
  • wordpress下载整站源码.vip域名做网站
  • ps网站建设教程视频毕业设计ppt答辩模板
  • 查看邮箱注册过的网站wordpress用户权限修改
  • 百度网盘做视频网站做网站是用什么语言的
  • 广告协会网站建设方案html5在线网站