ARC 是否保留无主引用的计数?

2024-04-13

ARC 是否保留对对象的无主引用的计数?

那么,如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 > 0,则该对象将被取消初始化但不会被取消分配?只有当强引用计数和无主引用计数达到 0 时,它才会被释放?

我在 Medium 上的一篇文章中读到了这一点,我认为)但我不确定它是否正确。


首先,我们要知道,这些问题的答案都是我们通常应该避免依赖的实现细节。现在,回答一下:

ARC 是否保留对对象的无主引用的计数?

是的,它是真实的。每个对象都有三个引用计数:强引用计数、无主引用计数和弱引用计数。

  • 强计数始终被存储(但存储时调整为 -1,因此存储的 0 表示强引用计数为 1,存储的 1 表示强引用计数为 2,依此类推)。

  • 无主计数也始终被存储,调整 +1 表示所有强引用,并在去初始化结束时删除。

  • 仅在创建对象的第一个弱引用后才存储弱引用计数。弱引用计数,如果存储的话,存储时加+1调整,它代表所有无主引用,并在对象被释放后被删除。

那么,如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 > 0,则该对象将被取消初始化但不会被取消分配?

正确的。对象被取消初始化:deinit运行对象的类和所有超类的 s,并且本身是引用的对象的任何属性都设置为 nil。但是,对象的内存不会被释放,因为对象的标头必须保持有效,直到最后一个unowned对该对象的引用被销毁。

只有当强引用计数和无主引用计数达到 0 时,它才会被释放?

正确的。当强引用计数和无主引用计数都达到零时,该对象将被释放。由于大多数对象从未被引用过unowned引用,这通常是在最后一个强引用被销毁时。

您没有询问弱引用,但为了完整起见,我也会解释它们。当一个对象被(或曾经被)弱引用时,Swift 会为该对象分配所谓的“侧表条目”(有时只是“侧表”)。

  • 如果对象没有 side table,则强计数和无主计数将直接存储在该对象中,并且不存储弱计数(必须为零)。

  • 如果一个对象有一个边表,那么指向该边表的指针将存储在该对象中。强计数、无主计数和弱计数以及返回对象的指针都存储在副表中。

对对象的弱引用存储为指向边表的指针,而不是指向对象的指针。这意味着即使仍然存在对对象的弱引用,也可以释放该对象(而不仅仅是取消初始化)。

当对象被释放时,边表也被释放if没有对该对象的弱引用。如果仍然存在弱引用,则该对象将被释放,但边表仍保持分配状态。当对已释放对象的最后一个弱引用被销毁时,边表将被释放。

请注意,当 Swift 对象被取消初始化或释放时,弱引用不会立即设置为 nil(销毁)!仅当程序尝试加载引用或弱引用的容器被取消初始化时,对取消初始化对象的弱引用才会设置为 nil。 (我所说的“容器”是指,例如,当一个对象有一个weak var财产。对象是对象的容器weak var参考。)


顶部有一个大评论RefCount.h在 Swift 源代码中 https://github.com/apple/swift/blob/master/stdlib/public/SwiftShims/RefCount.h解释了所有这些细节以及更多。


附:还有一种参考,unowned(unsafe),这不会调整任何引用计数。如果可能的话,您应该避免这种引用(并且避免几乎总是可能的)。

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

ARC 是否保留无主引用的计数? 的相关文章

随机推荐

  • 多个常数到一个矩阵并将它们转换为matlab中的块对角矩阵

    我有a1 a2 a3 它们是常数 我有一个矩阵A 我想做的是得到a1 A a2 A a3 A三个矩阵 然后我想将它们转移到对角块矩阵中 对于三个常数的情况 这很容易 我可以让b1 a1 A b2 a2 A b3 a3 A 然后在matlab
  • WCF 错误 - 已超出传入消息的最大消息大小配额 (65536) [重复]

    这个问题在这里已经有答案了 我的设置 托管在 IIS Express 中的 ASP NET 客户端 控制台应用程序中托管的 WCF 服务 在管理模式下运行 Visual Studio NET 2012 我试图从 WCF 服务返回 2 个 L
  • 如何在div中浮动span?

    我正在尝试学习如何在没有 Bootstrap 帮助的情况下实际使用 CSS 我有以下内容 可以在这里查看 http plnkr co edit FTCft1YOfQ4xy7FKWEHE p preview http plnkr co edi
  • 如何从新的 Lego Mindstorms Robot Inventor 上的自定义 Python 模块导入

    我一直在使用新的乐高 MINDSTORMS 机器人发明家 创建新的 项目 时 该项目似乎包含一个文件 然而 在每个示例代码文件的开头 我们可以看到 Mindstorm 模块已导入 如下所示 from mindstorms import MS
  • 从 Windows 10 bash shell 运行 Tomcat

    我在windows10 bash shell上安装了tomcat服务器 虽然它说 apache 正在运行 它没有在浏览器中打开管理面板 浏览器显示 无法到达连接 以前有人尝试过这个吗 请分享您的意见 谢谢 我假设您指的是 Windows 1
  • 我可以从闪存驱动器运行 Visual Studio 2010 吗?

    在我的工作中 我有一台装有 Windows 7 的新机器 我想保持我的开发技能 因此我想在该机器上加载我的 Visual Studio 2010 副本 但我没有管理员权限 我有一个 16 GB 闪存驱动器 是否可以将其加载到那里并从闪存驱动
  • 改变android中进度条的颜色

    我正在尝试更改水平进度条的颜色 但它没有改变 我做了一些谷歌搜索并浏览了您网站中给出的一些示例 但我没有成功地准确地改变颜色 我用了progressBar setProgressDrawable Drawable d 但它设置整个进度条视图
  • 想用jsp显示文件列表

    我是使用 glassfish 服务器的 netbeans 新手 我的 html 代码如下所示
  • 如何在 PHP 中包含一个类 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有文件index php 我想包含文件class twitter php在里面 我怎样才能做到这一点 希望当我将以下代码放入 index
  • TFS 构建服务器 - CSC:致命错误 CS2008:未指定输入

    当我们构建解决方案或错误引用的特定项目时 我们会在构建服务器上收到上述错误消息 我们可以使用 Visual Studio 也在构建服务器上 毫无问题地构建解决方案 但是在运行 msbuild 时会失败并出现上述错误 有任何想法吗 我找到了解
  • 在多个生命周期中运行 Maven 目标

    我有一个情况 我想在验证阶段和报告阶段运行 cobertura 插件 我有两个配置文件 它们都应该运行 cobertura 插件 但在配置文件 A 中 我只想创建 xml html 输出 但在配置文件 B 中 我将生成包含这些结果的完整站点
  • Selenium C# DefaultWait IgnoreExceptionTypes 不起作用

    我在等待 WebElement 可单击时使用 DefaultWait 尽管 TargetIncationException 是等待期间要忽略的异常列表中的异常之一 但在达到超时期限之前 我仍然有测试因该异常而失败 这不是我所期望的 publ
  • Linux下如何用C实现定时器的回调函数

    我已经在许多论坛上搜索了几天可能的解决方案 但没有运气 我在这里发布我的问题 非常感谢您的回复 主意 使用脚本控制灯光 Linux下C语言 应用场景 我有三盏灯 红 蓝 绿 脚本有控制它们的时间表 例如 从现在起10秒后 亮红灯2秒 从现在
  • 组合框 - 键入选择,然后单击焦点外 - 不会选择键入的项目

    我的组合框有问题 我有一个事件处理程序OnClick它根据选择的项目刷新数据 问题是当这种情况发生时 下拉组合框列出各种选项 在键盘上键入以查找匹配的项目 组合框更改此选择并调用OnClick event 由于此选择 事件 我的屏幕刷新 单
  • 如何使用reactJs根据背景颜色更改字体颜色

    我的容器有动态背景 它将由用户更改 因此我需要根据背景颜色设置文本颜色 例如 我设置容器的黑色背景 然后我需要为文本设置白色 我正在为我的应用程序使用 ReactJs 和材料 UI 库 请建议一些好的路径 请参阅下面的示例代码 import
  • 尝试加载方向变化的新视图

    我正在尝试在 Xcode 中创建一个应用程序 当手机从一个方向旋转到另一个方向时 该应用程序将切换到新视图 这是 switchviewcontroller h 文件代码 import
  • 下标变量

    有没有什么方法可以强制 Mathematica 独立于无下标变量来处理下标变量 进一步来说 比如说 我有以下定义 Subscript b 1 1 2 Subscript b 2 3 4 b Join Subscript b 1 Subscr
  • VS .Net:在安装程序项目中发布“来自 的主要输出”的构建事件

    我在项目中使用以下构建后操作 将库合并到我的应用程序中 IF ConfigurationName Debug GOTO end cp TargetPath TargetDir app unmerged exe del TargetPath
  • 将对象序列化为 XML

    我有一个继承的 C 类 我已经成功地 构建 了该对象 但我需要将对象序列化为 XML 有简单的方法吗 看起来该类已设置为序列化 但我不确定如何获取 XML 表示形式 我的类定义如下 System CodeDom Compiler Gener
  • ARC 是否保留无主引用的计数?

    ARC 是否保留对对象的无主引用的计数 那么 如果一个对象的强引用计数达到 0 并且该对象的无主引用计数 gt 0 则该对象将被取消初始化但不会被取消分配 只有当强引用计数和无主引用计数达到 0 时 它才会被释放 我在 Medium 上的一