“弱参考”:需要脚踏实地的解释

2024-02-12

有人可以解释一下吗弱引用在德尔福?

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


通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态。

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

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;

同样,父母和孩子可以保持彼此在身边,因为他们的相互参考可以防止他们的重新计数下降到零。

这是通过一个解决的weak reference:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“弱参考”:需要脚踏实地的解释 的相关文章

  • Delphi 远程调试器冻结

    我有运行 Delphi 2007 应用程序的 Windows Server 2008 R2 计算机 Update 当前无法切换 Delphi 版本 我有 Delphi XE 但在进行任何切换之前需要检查超过 300 000 行代码 我遇到了
  • 有没有办法获取正在运行或新打开的资源管理器窗口的 IExplorerBrowser 接口以供后续 BrowseToXXX 调用?

    这么问是因为在上一个问题 https stackoverflow com questions 6220899 answer 6221898我是指向 IExplorerBrowser 的指针 但是它创建了一个子窗口 而我想模拟资源管理器的 查
  • 新的 Delphi Rad Studio XE2 中的 FireMonkey (FMX) 包含哪些功能的详细信息?

    我听说德尔福全新 Rad Studio XE2有一个东西叫做火猴这将允许相同的代码构建 Windows 32 Windows 64 和MacOS应用程序 如果这是真的 那么这是巨大的 在哪里可以获得有关 FireMonkey 的技术文档 E
  • Delphi 2009之前如何处理UTF-8和ANSI转换?

    在 Delphi 2009 中 我们有 RichEdit1 Lines LoadFromFile OpenDialog1 FileName TEncoding UTF8 RichEdit1 Lines SaveToFile OpenDial
  • 在设计时存储“记录数组”的最佳方式

    我需要在设计时存储一组数据 以便在运行时构造一组组件的内容 像这样的事情 type TVulnerabilityData record Vulnerability TVulnerability Name string Description
  • 德尔福:idHttp+SSL

    请解释一下如何使用 SSL https 从服务器下载文件 我在互联网上没有找到合适的答案 每个人都说 TIdSSLIOHandlerSocket 但我只有 TIdSSLIOHandlerSocketOpenSSL 如果我使用 TIdSSLI
  • 以与文件大小相同的格式获取类或对象的大小?

    如何从内存中最好地确定类的大小 这是一个可以使用的基本示例类 请注意 这些变量除了用于示例之外没有其他用途 type TMyClass class public fString1 string fString2 string fIntege
  • ClientDataset 索引更改时不计算 TAggregateField

    我正在使用连接到 DBGrid 的 TClientDataset 和几个聚合字段 用于计算其他几个浮点字段的总和 所有字段均已在设计时创建 一切都按预期工作 直到 ClientDataset 的 IndexName 使用自定义索引更改 以便
  • TEdit onclick 全选?

    每当用户单击 TEdit1 或单击选择其中的某些文本时 如何选择 TEdit1 的所有文本 执行超出默认行为的任何操作都可能非常危险TEdit控制 您的用户知道标准 Windows 控件的行为方式 任何偏离此的行为都可能导致混乱 默认情况下
  • Firemonkey - 更新视觉组件

    我们从版本 1 开始就使用 Firemonkey 但仍然发现更新当前在屏幕上可见的组件很困难 在 Firemonkey 中请求重画的 方式 有很多 也许太多了 应用样式 ApplyStyle 事件 主要是当它在屏幕上可见时 请求 repai
  • 如何仅在某些列中设置带有复选框的 TListView?

    我正在使用 Delphi 2010 并且我试图允许用户在 TListView 中的每行 2 个选项之间进行选择 使用 TListView 我可以将样式设置为 vsReport 并启用复选框 但这只会让我每行有 1 个复选框 我需要的是每行
  • 启动时系统托盘图标不出现

    我在 FormCreate 事件处理程序中使用以下代码来创建系统托盘图标 当我运行程序时 系统托盘图标显示正常 我将应用程序设置为在 Windows 启动时自动启动 当我重新启动计算机时 我的应用程序进程已启动 但系统托盘图标从未出现 我认
  • TRESTRequest:是否可以在 POST 请求中使用自定义媒体类型?

    例如 我们有一个 API 需要我们自己的供应商特定内容类型application vnd xxxx custom custom data json但查看 REST Client 的源代码 它似乎总是默认为 REST Types 中的 Con
  • delphi分组框标题颜色变化

    我正在使用 BDS 2006 想知道您是否可以使用项目中存在的 XPmanifest 更改组框和单选按钮组标题的颜色 因为它始终是蓝色 唯一的方法是重写 Paint 方法TGroupBox http docwiki embarcadero
  • 如何在 TList 中存储动态数组?

    我需要存储未知数量的组 每个组都有未知数量的元素 项目 这是我的 小组 TGroup array of Integer lt dynamic array as you can see 我想使用 TList 来保存我的组 我的想法是 我可能想
  • FreeMM 与 ShareMem

    我们有很多用 delphi 和 c builder 编写的 dll 库 并使用 sharemem 和 borlndmm dll 3d party 库中的对齐问题迫使我们转向 delphi 2007 中的新内存管理器 有人可以帮我解释一下 共
  • 在 Delphi XE 中将类作为过程的参数传递

    我需要做的是这样的 procedure A type of form var form TForm begin form type of form Create application form showmodal freeandnil f
  • Delphi DataSnap REST 服务器从 TStream 返回 JSON 数组,而不是二进制

    我有一个与 Android 客户端通信的 REST 服务器 我将它从 XE3 ish 升级到 Berlin 其中一个服务器方法返回一个包含 jpeg 的 TStream 并且工作得很好 很高兴将图像作为二进制图像返回 升级到 Berlin
  • 如何读取注册表项的默认值

    我有一个 Delphi XE2 项目来使用注册表项进行某些操作 所以我定义了以下代码 procedure TMainForm BitBtn01Click Sender TObject var RegistryEntry TRegistry
  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref

随机推荐

  • 从 C#/.NET 调用 C++ 函数

    我有一个包含 C 项目和 C 项目的解决方案 C 项目定义了一个类 我想在 C 中实例化该类并调用其成员函数 到目前为止 我成功实例化了该类 CFoo Bar new CFoo 但是当我尝试调用它的函数时 编译器说它不可用 另外 当我检查调
  • 使用 Node.js 进行网页抓取时,我可以在页面上运行所有 JavaScript 吗? (即模拟真实的浏览器?)

    我正在尝试使用 Node js 进行一些网络抓取 使用jsdom 很容易加载 DOM 并将 JavaScript 注入其中 我想更进一步 运行从网页链接到的所有 JavaScript 然后检查生成的 DOM 包括元素的视觉属性 高度 宽度等
  • ng 服务:找不到模块“tapable”

    我刚刚将我的 Angular 5 项目从一台计算机转移到另一台计算机 在新设备中尝试时出现以下错误ng serve Cannot find module tapable Error Cannot find module tapable at
  • 如何在 Compact Framework 中将图像图标添加到标题栏并隐藏底部栏。?

    1 我想在表单标题中添加徽标 图像 我怎么做 2 在 Windows Phone 中 底部会出现一个带有键盘标志的栏 当我使用自定义键盘时 如何删除此栏 标题栏 可以通过删除 设置为空 表单的主菜单来 删除 底部栏 标题栏 顶部栏 无法轻松
  • vim:打开水平和垂直分割的4个文件

    在命令行上 vim可以打开4个水平分割的文件 vim o file1 file2 file3 file4 或 4 个文件垂直分割 vim O file1 file2 file3 file4 如何打开 4 个文件 使其水平和垂直分割 如下所示
  • 从数据库填充下拉列表

    我的实体框架中有一个 mvc 3 应用程序 其中有 2 个表 我有另一个名为 Product 的表 其中包含 ProductID 和 ProductName 创建新视图以插入新购买 如何将视图中的 ProductID 文本框更改为由 Pro
  • 导入库仅用于调试

    我在用stetho用于调试我的应用程序的lib Gradle debugCompile com facebook stetho stetho 1 4 1 debugCompile com uphyca stetho realm 2 0 0
  • 添加Java系统模块在Eclipse中编译

    我有一些遗留的 Java 代码 即 package org alo test j9 import javax activation DataHandler in java activation module import javax ann
  • SetWindowSubclass 内的 msftedit.dll RichEdit 控件出现“访问冲突读取位置 0x00000008”错误

    我在单独的子类文件中有编辑控件 在开始工作 SetWindowSubclass 函数后 我是 C 新手 之前我使用 SetWindowLongPtr 进行子类化 它工作得很好 但有人建议我开始使用 SetWindowSubclass 我遇到
  • Grails 渲染插件在部署时不会渲染图像

    我正在使用 grails 渲染插件生成 pdf 在开发过程中 我使用带 src 的标签将图像包含到服务器上的图像中 它工作正常 但部署应用程序后就不再工作了 图像就消失了 我正在通过模板进行渲染 因此当我在 gsp 中调用此模板时 这是可以
  • IQueryable 复杂顺序 $sort 中仅允许使用字段

    我想对列表进行排序 当它是IEnumerable时它工作正常 但是我将其更改为IQueryable来查询MongoDB时 它不起作用 给我这个错误 System NotSupportedException sort 中仅允许使用字段 Que
  • python3 super 不适用于 PyQt 类

    python3中有一个简单的程序 from PyQt4 import QtCore import PyQt4 class Bar object def init self print Bar start super Bar self ini
  • 如何从来宾操作系统获取 Citrix XenServer VM 的唯一 ID?

    假设我有多个同名的 Citrix XenServer VM 或者 这些名字都是垃圾 没关系 从其中一台虚拟机上的来宾操作系统中 我如何以编程方式确定虚拟机的 ID 我希望虚拟机的 UUID 应该作为来宾操作系统的 BIOS 序列号 但事实并
  • Typo3 流体图像裁剪,高度失败

    使用此代码
  • TouchJSON 返回可变对象吗?

    我从网络服务接收一些 json 我使用 TouchJSON 库解析它 我保留数据供用户更改某些值 然后我想将其返回到网络服务 我得到的 JSON 对象在对象中包含 NSDictionary 对象 如下所示 id null created a
  • 开源、多平台、基于浏览器的屏幕捕获扩展? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑一个项目 该项目涉及浏览器用户能够屏幕捕获任何网页的内容 最好是整个页面 而不仅仅是可见部分
  • 为什么 cqlsh 右对齐字符串?

    我发现使用 cqlsh 显示的字符串值是右对齐的 是否有一个原因 有没有办法左对齐字符串 cqlsh test gt create table test id int a ascii t text primary key id cqlsh
  • 当其中一个容器失败时,SSIS 包是否失败

    我有一个包含 1 个容器的包 如果该容器失败 ssis 包是否会失败 该物业 失败时失败包 对于容器来说是 false 这是否意味着只有当该属性设置为 TRUE 时包才会失败 否则只有容器状态失败 而包状态不是 是的 如果序列容器失败 则整
  • 获取webclient中通过AJAX生成的html

    我经常去某个网站查找资料 我心想 等等 我可以编程 当我可以编写一个为我做这件事的软件时 为什么我要手动访问这个网站呢 于是我开始了 我使用的是 C 所以我找到了 WebClient 和 Uri 我已经设法获取该网站的源代码 但出现的问题是
  • “弱参考”:需要脚踏实地的解释

    有人可以解释一下吗弱引用在德尔福 我注意到这个概念经常在我仔细检查的一些库 框架源代码中提到 我陷入了困境 想要对其有一个清晰的了解 通过接口引用相互引用的实例在基于引用计数的接口实现中使彼此保持活动状态 弱引用用于打破 让彼此活着 的熊抱