iphone - ARC 还是不 ARC?有什么优点和缺点?

标签 iphone objective-c ipad ios5 automatic-ref-counting

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

7年前关闭。



Improve this question




我还没有使用 ARC,因为我目前正在处理的项目中的大部分代码都是在 iOS 5.0 之前编写的。

我只是想知道,不手动保留/释放(以及由此产生的可能更可靠的代码?)的便利性是否超过了使用 ARC 的任何“成本”?
您对 ARC 有什么经验,您会推荐它吗?

所以:

  • ARC 能为项目带来多少好处?
  • ARC 是否有像 Java 中的垃圾收集那样的成本?
  • 您是否一直在使用 ARC,如果使用过,到目前为止您是如何找到它的?
  • 最佳答案

    没有缺点。使用它。今天就去做。它比您的旧代码更快。它比你的旧代码更安全。它比您的旧代码更容易。这不是垃圾收集。它没有 GC 运行时开销。编译器在您应该拥有的所有位置插入保留和释放。但它比你更聪明,可以优化那些实际上不需要的(就像它可以展开循环、消除临时变量、内联函数等)

    好的,现在我会告诉你一些小的缺点:

  • 如果你是一个长期的 ObjC 开发者,当你看到 ARC 代码时,你会抽搐大约一周。你会很快克服这一点。
  • 在桥接到 Core Foundation 代码时有一些(非常)小的复杂性。处理任何处理 id 的事情会稍微复杂一些。作为 void* .诸如 id 的 C 数组之类的东西可以多花点时间思考一下才能正确地做。 ObjC 的花式处理 va_args也会造成麻烦。大多数涉及 ObjC 指针数学的事情都比较棘手。在任何情况下,你都不应该有太多这样的东西。
  • 您不能输入 idstruct .这是相当罕见的,但有时用于打包数据。
  • 如果您没有遵循正确的 KVC 命名,并且您混合使用 ARC 和非 ARC 代码,则会出现内存问题。 ARC 使用 KVC 命名来决定内存管理。如果都是 ARC 代码,那么没关系,因为它会在双方都做同样的“错误”。但是如果它混合了 ARC/非 ARC,那么就会出现不匹配。
  • ARC 将在 ObjC 异常抛出期间泄漏内存。 ObjC 异常应该非常接近程序终止的时间。如果您捕获了大量 ObjC 异常,则说明您使用它们的方式不正确。这可以使用 -fobjc-arc-exceptions 修复,但会招致以下讨论的处罚:
  • ARC 不会在 ObjC++ 代码中的 ObjC 或 C++ 异常抛出期间泄漏内存,但这是以时间和空间性能为代价的。这是尽量减少 ObjC++ 使用的众多原因中的另一个。
  • ARC 在 iPhoneOS 3 或 Mac OS X 10.5 或更早版本上根本不起作用。 (这使我无法在许多项目中使用 ARC。)
  • __weak指针在 iOS 4 或 Mac OS X 10.6 上不能正常工作,这是一种耻辱,但很容易解决。 __weak指针很棒,但它们不是 ARC 的第一卖点。

  • 对于 95% 以上的代码,ARC 非常出色,完全没有理由避免它(前提是您可以处理操作系统版本限制)。对于非ARC代码,可以通过-fno-objc-arc在逐个文件的基础上。不幸的是,Xcode 使这比在实践中应该做的要困难得多。您可能应该将非 ARC 代码移动到单独的 xcodeproj 中以简化此操作。

    总之,尽快切换到 ARC,永远不要回头。

    编辑

    我已经看到了一些评论“使用 ARC 不能替代了解 Cocoa 内存管理规则”。这在很大程度上是正确的,但重要的是要了解原因和原因。首先,如果您的所有代码都使用 ARC,并且您违反了 Three Magic Words到处都是,你仍然没有问题。说起来令人震惊,但你去了。 ARC 可能会保留一些您不希望它保留的东西,但它也会释放它们,所以这无关紧要。如果我今天在 Cocoa 中教授一门新类(class),我可能不会在实际内存管理规则上花超过五分钟的时间,而且我可能只会在讨论 KVC 命名时提到内存管理命名规则。使用 ARC,我相信您实际上可以成为一名体面的初级程序员,而无需学习内存管理规则。

    但是你不能成为一个像样的中级程序员。您需要了解规则才能与 Core Foundation 正确桥接,每个中级程序员都需要在某个时候处理 CF。并且您需要了解混合 ARC/MRC 代码的规则。当您开始使用 void* 时,您需要了解规则。指向 id 的指针(您继续需要正确执行 KVO)。还有块……嗯,块内存管理很奇怪。

    所以我的观点是底层内存管理仍然很重要,但是我曾经花费大量时间为新程序员陈述和重申规则,而 ARC 正在成为一个更高级的主题。我宁愿让新开发人员从对象图的角度思考,而不是用对 objc_retain() 的底层调用来填满他们的头脑。 .

    关于iphone - ARC 还是不 ARC?有什么优点和缺点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8760431/

    相关文章:

    ios - 如何为 block 捕获变量的当前值

    objective-c - 我如何将 FMDatabase 存储到 iCloud

    iphone - 如何删除 UITextView 的最后一个空行?

    ios - AVAudioplayer 初始化组件抛出空异常

    iPhone 全屏图像

    iphone - 无法缩进 UITableViewCell 子类

    iOS11 键盘问题 - 键盘高度不正确

    c# - iPhone 编程 - 印象,意见?

    ios - 用户按下了 UIAlertView 上的哪个按钮?

    iphone - iOS 的崩溃分析和报告