【问题标题】:Objective-C ARC vs. MRR: why the switch?Objective-C ARC 与 MRR:为什么要切换?
【发布时间】:2011-12-18 21:45:36
【问题描述】:

我是一名来自 C#/Java 背景的新可可开发人员。我已经了解了 Objective-c 语言使用的内存管理模式,我发现它们对代码意识的开发非常有帮助。

为什么 Apple 现在希望我们使用 ARC(自动引用计数)而不是 MRR(手动保留-释放)?除了节省时间之外,ARC 还提供哪些优势?

我看到这种转变对开发人员从 obj-c 生态系统中获得的良好公民习惯产生了负面影响。

尼克

【问题讨论】:

  • 感谢@pst 的编辑。那是我的第一篇文章,我忘了进一步解释新的首字母缩略词。

标签: objective-c cocoa memory-management ios5 automatic-ref-counting


【解决方案1】:

不幸的是,让有能力的开发人员更容易正确正确有一个副作用,即让新开发人员更容易不学习,但看起来这可能是值得的。

ARC 没有像 C# 或 Java 这样的跟踪收集器那样宽容。如果您没有明确的对象所有权模型,您几乎肯定会创建循环并泄漏大量内存。我希望这一点足够明显(通过 Instruments?这仍然需要寻找它......不确定在这里可以做什么)新开发人员将很快学会保持他们的对象图清晰和非循环。

【讨论】:

  • 感谢@Catfish_Man,我更希望 ARC 更像是静态分析器支持的编译器警告系统。
  • @NicholasE.Credli:故意严格:大多数 ARC 规则都基于编译器必须 100% 正确的原则,所以当你抛出一个模棱两可的情况时,它不会猜你的意思,只会抛出一个错误。解决方案就是让您的代码明确。
【解决方案2】:

ARC 让我可以专注于编写有用的代码而不是样板的 dealloc 方法。

无论如何,我认识的大多数人都在每个alloc 后面使用了autorelease,因为它在以后为您节省了release,并且您不能忘记实际输入它。所以对象一直存在,直到自动释放池被耗尽,并且使用 ARC 对象在不再需要时被释放。我认为在这些情况下,ARC 编译的程序甚至会使用更少的内存。

而且,真丢脸,它也帮助我减少了我的应用程序崩溃的频率。
每 10.000 次发布就会发生的过早发布。我永远无法完全追踪的那个,希望 ARC 已经成为过去。


我看到这种转变对开发人员从 obj-c 生态系统中获得的良好公民习惯产生了负面影响。

可能与从汇编程序开始的嵌入式开发人员认为从 C 开始并且从未使用过汇编程序的人会养成坏习惯的方式相同。

在我看来,MRR 与 ARC 的讨论是相似的。
ARC 和 C 都允许在更短的时间内编写更多可维护的代码。 而且它们都会导致更大的内存和 CPU 占用。
如果我没记错的话,Apple 宣布他们确实为 retainrelease 增加了一点速度,以补偿对 CPU 使用率的影响。正因为如此,MMR 仍然存在并没有真正的理由。

首先,我欢迎我们的新 ARC 霸主。

【讨论】:

    【解决方案3】:

    实际上,我很享受搬到 ARC 的过程 - 少了一件需要考虑的事情。最重要的是,我认为新手经常会被命名约定(+alloc,-copy 等与 [NSString stringWith....])的重要性绊倒。唯一棘手的一点是,当您开始处理 CoreFoundation 等(C API)时,您仍然必须记住谁拥有什么。

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 1970-01-01
      • 2012-05-04
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多