关于iphone:使用ARC有哪些优缺点?

What are the advantages and disadvantages of using ARC?

在iOS项目中使用新的自动参考计数(ARC)内存管理风格有哪些优点和缺点?

在使用iOS 5.0 SDK开发时,是否可以选择不使用ARC?

您是否推荐ARC或手动参考计数(MRC)用于新项目?

使用ARC的应用程序是否能够在比iOS 5.0更旧的操作系统版本上运行?


What are the advantages and disadvantages of using the new automatic reference counting (ARC) memory management style in an iOS project?

ARC程序的执行几乎与编写良好的MRC相同。也就是说,行为差异往往是不可检测的,因为操作顺序和性能都非常接近。

如果您已经知道如何使用手动引用计数(MRC)实现OS X或IOS应用程序,那么ARC并没有真正添加功能——它只允许您从源代码中删除引用计数操作。

如果你不想学MRC,那么你可以先试试ARC。很多人都在努力,或者试图忽略MRC的常见实践(例如:我向静态分析器引入了许多objc devs)。如果您想避免这些问题,ARC将允许您推迟您的理解;您不能在不理解引用计数和对象生命周期以及关系(无论是MRC、ARC还是GC)的情况下编写重要的OBJC程序。ARC和GC只需从源代码中删除实现,并在大多数情况下做正确的事情。有了ARC和GC,您仍然需要提供一些指导。

我没有测量过,但是值得一提的是,编译弧源需要更多的时间和资源。

如果您正在开发的程序对引用计数的使用相当松散(例如,典型的自动释放量),那么切换到ARC确实可以提高程序的执行时间和峰值内存使用率。

Can you choose not to use ARC when developing with the iOS 5.0 SDK?

是的,使用clang_启用_objc_arc。ARC是二进制兼容的,真正发生的是编译器会根据当前翻译可见的声明自动为您引入适当的引用计数操作(请参阅我的答案,了解为什么翻译可见性很重要)。因此,您还可以为项目中的某些源启用和禁用它,并为其他源启用它。

但是,混合模式(一些MRC和一些ARC源)非常复杂,而且很微妙,尤其是编译器可能复制的WRT实现(例如,内联函数的主体可能不正确)。这种混合模式问题将很难孤立。在这方面,objc++程序和源程序将特别困难。此外,根据您的优化设置(例如),行为可能会有所不同;在调试构建中工作良好的程序可能会在发行版中引入泄漏或僵尸。

Do you recommend ARC or manual reference counting (MRC) for a new project?

就我个人而言,我会坚持一段时间的MRC。即使ARC已经在实际使用中进行了测试,但仍可能存在一些问题,这些问题会出现在复杂的场景中,您希望避免成为第一个了解和调试的人。OSX的垃圾收集就是您可能希望等待的一个例子。例如,当对象被破坏时,开关可能会改变——您的对象可能会很快被破坏,并且永远不会被放置在自动释放池中。它还可以改变释放ivar的顺序,这可能会产生一些副作用。

我还有一个很大的代码库,我不想在测试这个特性的时候浪费一周时间。最后,向后兼容性对我来说仍然很重要。

Will an application using ARC be able to run on older OS versions than iOS 5.0?

如果您使用MRC开发,它将向后兼容。如果您使用ARC开发,它不一定是兼容的。事实上,如果没有一点额外的工作,它甚至可能无法编译。运行时的要求在一些早期版本中可用。另请参见此问题。如果您需要向后兼容性,对于某些操作系统版本,ARC将不是一个选项。

最后,如果您将选择限制在gc或arc,我建议使用arc。


你可以用CLANG_ENABLE_OBJC_ARC = NO把它关掉/打开。优点是你必须写更少的代码,内存管理更容易。缺点是你必须把你学到的关于内存管理的所有知识都擦掉:)我宁愿关掉它。


我使用的是Lion和Xcode 4.3。我也有同样的问题。

为了解决这个问题,我把"构建设置->目标C自动参考CO"改为"否"。

为了查看它是否设置为"是",我还必须启用工具栏上"构建设置"工具栏正下方的"所有"和"级别"选项。

启用这些选项后,我可以看到我的项目将该选项设置为"是"。我花了一段时间才发现默认设置为"否",这是在启用"级别"选项之前显示的内容。


您可以通过"编辑->重构->转换为目标C弧"打开ARC,这将完全重构您的代码(去掉所有内存管理调用等)。没有逆向操作,所以如果你有第二个想法,确保你的事情在源代码控制下。这篇文章向您展示了如何对特定文件禁用它。我不认为有太多的理由不去考虑它,除了这样一个事实,那就是看到所有这些努力都投入到良好的内存管理中去了,这是很痛苦的,而且每次我们看到init、new、copy而没有相应的release/autorelease时,我们都必须停止跳到天花板上(这需要一些使用)。到)也许有人会说,在某些情况下,手动内存管理会显著提高性能/内存占用,如果是这样的话,我也会感兴趣。