【问题标题】:To use Automatic Reference Counting or not to use使用自动引用计数或不使用
【发布时间】:2012-10-24 11:33:48
【问题描述】:

我目前正在学习 Objective C,到目前为止,我一直在我的所有项目中使用自动引用计数。然而,在与一些同事交谈后,在浏览了一些在线论坛后,我注意到关闭自动引用计数并手动管理内存的趋势。

我一直想知道 ARC 是否做得足够好,或者它是否偶尔会掉球。手动分配/释放内存更有效吗?有些人会因为习惯而关闭 ARC 吗?

我应该继续使用 ARC 吗?如果没有,是否有人知道 ARC 在未来的某个时间点会足够好使用?

【问题讨论】:

标签: objective-c automatic-ref-counting


【解决方案1】:

简单的答案:使用 ARC。

长答案:说真的,只需使用 ARC。

我知道没有令人信服的理由不使用 ARC。有用。它比手动内存管理要好。用它。也就是说,您仍然应该知道什么是内存管理以及引用计数是如何工作的。 ARC 根本没有改变这种行为,它只是添加了所需的 retainreleaseautorelease 调用以遵守使用 Objective-C 时已成为标准的约定。

【讨论】:

    【解决方案2】:

    ARC 在内存处理方面做得比大多数人要好得多。仅在某些情况下最好关闭 ARC,但我怀疑我们中的许多开发人员是否也需要。

    另见: To ARC or not to ARC? What are the pros and cons?

    【讨论】:

    • 为该讨论的链接干杯。我搜索了关于自动引用计数的任何辩论,但找不到任何东西。我显然输入了错误的东西,因为这正是我要找的。​​span>
    【解决方案3】:

    当宣布 ARC 时,我很想避免它。原因是,我花了很多时间在 Java 上工作,并且看到自动内存管理能够让程序员忘记对象关系的逻辑结构,并诱导他们创建相当于“意大利面条代码”的 OOP。

    到目前为止,我所看到的 ARC 并不支持这种恐惧。由于weakstrong 指定,人们仍然需要考虑对象生命周期,但需要更少的输入。当我在这里回答那些在 ARC 环境中存在内存管理问题的人提出的问题时,这是因为在非 ARC 环境中也存在问题的代码。

    我现在没有看到缺点。

    【讨论】:

    • ARC 不是垃圾回收。所以它与 Java 之类的自动内存管理有很大不同。
    • 明白。在实际使用它之前,当它们应用于对象组织和设计时,我没有意识到它的含义。
    【解决方案4】:

    在大多数情况下,使用 ARC 应该比手动处理内存管理更有效。如果您不需要旧 iOS 版本的兼容性,请使用 ARC,它会比您做得更好。即使有些旧框架不支持 ARC,您也可以仅针对这些文件停用它。

    这个博客已经有一年了,但解释得很好:http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

    【讨论】:

      【解决方案5】:

      您的同事错了,或者更有可能,他们不想转换为 ARC,因为担心他们的专业知识可能会在下一次洗牌到来时失去管理。

      使用 ARC 和 64 位运行时将认真清理您的代码。我在 ARC 项目中使用的行数减少了约 30%。从长远来看,您将在项目上节省几天甚至几周的时间。就我个人而言,我不需要在我的任何 ARC 项目中追踪自动发布的 CALayer。

      此外,由于编译器使用生命周期限定符来注释对象的生命周期,它通常比您做得更好。在高度嵌套的代码中,您最不想考虑的就是发布优化。

      ARC 将引导您成为更好的程序员,但如果没有,您将走上比以前更好的道路。例如,多年来,发布/保留代码已经让人们摆脱了合成 setter 滥用(即:仅仅因为 self.property = property[_property release], _property = [newProperty retain] 更好而创建一个属性)。我受够了通过 self.property 看到对 setter 的显式调用。由于 ARC 不再需要保留和释放,因此没有令人信服的理由来滥用属性设置器,您的代码开始变得更加明显且气味更少。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-09-29
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-10
        • 2018-03-04
        相关资源
        最近更新 更多