热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

ARC是否保存计数以备不时之需?

如何解决《ARC是否保存计数以备不时之需?》经验,为你挑选了1个好方法。

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

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

我在一篇有关Medium的文章中阅读过),但是我不确定它是正确的。



1> rob mayoff..:

首先,请注意,这些问题的答案都是我们通常应避免依赖的所有实现细节。现在,继续回答:

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

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

始终存储强计数(但以-1的调整存储,因此存储的0表示强参考计数1,而存储的1表示强参考计数2,依此类推)。

还将始终存储无主计数,调整后的+1表示所有强引用,并且在取消初始化结束时被删除。

弱引用计数仅在创建对对象的第一个弱引用后才存储。弱引用计数(如果已存储)将通过+1调整进行存储,该调整表示所有未拥有的引用,并在释放对象后将其删除。

那么,如果某个对象的强引用计数达到0并且该对象的未拥有引用计数> 0,则该对象将被取消初始化但未取消分配?

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

并且只有当强大且无主的引用计数达到0时,它才会被取消分配吗?

正确。当强引用计数和无所有权引用计数都达到零时,将释放对象。由于大多数对象从未被unowned引用引用,因此通常是在销毁最后一个强引用时使用。

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

如果对象没有边表,则强计数和无所有者计数将直接存储在该对象中,而弱计数(必须为零)不会存储。

如果对象具有边表,则指向该边表的指针将存储在该对象中。强计数,无计数和弱计数以及指向对象的指针都存储在边表中。

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

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

请注意,在取消初始化或释放Swift对象时,弱引用不会立即设置为nil(已销毁)!仅当程序尝试加载引用或弱引用的容器被取消初始化时,对未初始化对象的弱引用才设置为nil。(例如,当对象具有weak var属性时,“容器”就是我的意思。该对象是weak var引用的容器。)


RefCount.hSwift源代码顶部的大注释解释了所有这些详细信息以及更多信息。


PS还有另一种参考unowned(unsafe),它不调整任何参考计数。您应尽可能避免使用此类参考(并且几乎总是可以避免)。


推荐阅读
  • Spring框架的核心组件与架构解析 ... [详细]
  • 本文对常见的字符串哈希函数进行了全面分析,涵盖了BKDRHash、APHash、DJBHash、JSHash、RSHash、SDBMHash、PJWHash和ELFHash等多种算法。这些哈希函数在不同的应用场景中表现出各异的性能特点,通过对比其算法原理、计算效率和碰撞概率,为实际应用提供了有价值的参考。 ... [详细]
  • (1)前期知识:1. 单机架构:单一服务器计算机——其处理能力和存储容量有限。2. 集群架构(负载均衡器与多节点服务器)——通过增加节点数量来提升系统性能和可靠性,实现高效的任务分配和资源利用。 ... [详细]
  • 如何使用CSS3创建圆角边框效果? ... [详细]
  • 本文探讨了使用Python进行微服务架构设计的合理性和适用性。首先,介绍了微服务的基本概念及其在现代软件开发中的重要性。接着,通过具体的业务场景,详细分析了Python在微服务架构设计中的优势和挑战。文章还讨论了在实际应用中可能遇到的问题,并提出了相应的解决方案。希望本文能够为从事Python微服务开发的技术人员提供有价值的参考和指导。 ... [详细]
  • Docker入门指南:初探容器化技术
    Docker入门指南:初探容器化技术摘要:Docker 是一个使用 Go 语言开发的开源容器平台,旨在实现应用程序的构建、分发和运行的标准化。通过将应用及其依赖打包成轻量级的容器,Docker 能够确保应用在任何环境中都能一致地运行,从而提高开发和部署的效率。本文将详细介绍 Docker 的基本概念、核心功能以及如何快速上手使用这一强大的容器化工具。 ... [详细]
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • 本文详细介绍了如何安全地手动卸载Exchange Server 2003,以确保系统的稳定性和数据的完整性。根据微软官方支持文档(https://support.microsoft.com/kb833396/zh-cn),在进行卸载操作前,需要特别注意备份重要数据,并遵循一系列严格的步骤,以避免对现有网络环境造成不利影响。此外,文章还提供了详细的故障排除指南,帮助管理员在遇到问题时能够迅速解决,确保整个卸载过程顺利进行。 ... [详细]
  • 大家好,全新的技术专栏《从零开始掌握容器云网络实战》正式上线。该专栏将系统地介绍容器云网络的基础知识、核心技术和实际应用案例,帮助读者全面理解和掌握容器云网络的关键技术与实践方法。 ... [详细]
  • Redis哈希数据结构入门指南
    Redis的哈希数据结构与Java中的HashMap类似,采用数组加链表的方式实现。数组用于存储哈希值的位置,而链表则用于处理哈希冲突的情况。此外,Redis的哈希数据结构还支持高效的字段操作和内存优化,适用于多种应用场景,如缓存和会话管理。 ... [详细]
  • PHP编程中的命名规则与最佳实践 ... [详细]
  • 在Python中,是否可以通过使用Tkinter或ttk库创建一个具有自动换行功能的多行标签,并使其宽度能够随着父容器的变化而动态调整?例如,在调整NotePad窗口宽度时,实现类似记事本的自动换行效果。这种功能在设计需要显示长文本的对话框时非常有用,确保文本内容能够完整且美观地展示。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 本文深入探讨了 hCalendar 微格式在事件与时间、地点相关活动标记中的应用。作为微格式系列文章的第四篇,前文已分别介绍了 rel 属性用于定义链接关系、XFN 微格式增强链接的人际关系描述以及 hCard 微格式对个人和组织信息的描述。本次将重点解析 hCalendar 如何通过结构化数据标记,提高事件信息的可读性和互操作性。 ... [详细]
author-avatar
左右印象摄影
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有