为啥在启用 ARC 的项目中不需要维护保留计数

Posted

技术标签:

【中文标题】为啥在启用 ARC 的项目中不需要维护保留计数【英文标题】:Why maintaining retain count is not required in ARC enabled project为什么在启用 ARC 的项目中不需要维护保留计数 【发布时间】:2015-07-28 05:54:34 【问题描述】:

保留计数是 Objective-C 中管理内存的方式。当您创建一个对象时,它的保留计数为 1。当您向一个对象发送保留消息时,它的保留计数增加 1,我们知道 ARC 会自动执行此操作,但它使用的技术是什么? ?

我仍然想知道内存管理是否是自动完成的,那么为什么有时我们会在对象分配或检索时遇到错误的访问错误。

我已经浏览了这个链接:- https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

【问题讨论】:

我真的不知道为什么人们会拒绝投票?至少他们必须在分析问题时提供一些理由或指出错误或逻辑错误。在否决投票之前必须进行一些验证,以便版主可以评估。 【参考方案1】:

我认为 ARC(由编译器在编译时完成,通过在“必要”处插入保留/释放命令)依赖于变量的范围、定义它们的代码块(即初始化)以及它的值是否为存储在另一个变量中,其范围比初始变量的范围更广。

这就是为什么您必须更准确地声明变量访问和存储的类型:以告知编译器您对变量的意图。

但我也认为 ARC 看不到比当前文件更远的内容。 ARC 在全局变量和文件间依赖方面更加棘手。

因此,Apple 使用更复杂的变量声明语法来替换非常简单的 (IMO) 保留/释放模式。所以开发者不必担心内存管理。

这使得更多习惯于管理语言的开发人员(如网络开发人员)能够访问 Apple 生态系统来进行 iOS 开发。

我认为让开发人员相信无需了解内存管理等 IT 中的基本概念即可高效开发是错误的。

但更多的 iOS 开发者意味着更多的程序开发和更稳定的生态系统在活动方面,所以苹果的收入更多:-)

【讨论】:

【参考方案2】:

您最好阅读 ARC 文档:https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

ARC 将为您管理内存,但它不能阻止您编写编程错误,例如仅持有对对象的弱引用。

【讨论】:

感谢我正在浏览的链接,但只有弱属性/引用会导致项目中的错误访问或错误并不总是正确的,我也看到了许多内存泄漏和强对象错误。是的,正如你所说,有可能出现只有 ARC 无法处理的编程错误。这就是我所提到的,你不能 100% 确定 ARC 会处理所有内存分配和释放。

以上是关于为啥在启用 ARC 的项目中不需要维护保留计数的主要内容,如果未能解决你的问题,请参考以下文章

为啥在调试模式和运行模式下保留计数不同?

第30条:以ARC简化引用计数

如何以编程方式为非 ARC xcode 项目中的特定文件启用 ARC?

如何在 xcode 中将启用 ARC 的 .a 文件添加到非 ARC 项目

在启用 ARC 的代码中修复警告“在此块中强烈捕获 [an object] 可能会导致保留周期”

为啥在 ARC 中发送消息会导致保留周期警告,但属性集不会?