使用ARC的优点和缺点是什么?

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

你可以select在使用iOS 5.0 SDK进行开发时不使用ARC吗?

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

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

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

一个ARC程序的执行与写得很好的MRC几乎是一样的。 也就是说,行为差异通常是无法察觉的,因为操作和performance的顺序非常接近。

如果您已经知道如何使用手动引用计数(MRC)来实现OS X或iOS应用程序,则ARC并不真正添加function – 它只是允许您从源中删除引用计数操作。

如果你不想学习MRC,那么你可能想先试试ARC。 很多人都在苦苦挣扎,或者试图忽略MRC的常见做法(例如:我已经向静态分析器引入了一些objc开发工具)。 如果你想避免这些问题,ARC会让你推迟你的理解; 如果不理解引用计数和对象的生存期和关系,无论是MRC,ARC还是GC,都不能编写非常规的objc程序。 ARC和GC只是简单地从您的来源中删除实施,并在大多数情况下做正确的事情。 使用ARC和GC,您仍然需要提供一些指导。

我还没有对此进行评估,但值得一提的是, 编译 ARC源代码需要更多的时间和资源。

如果您正在开发的程序使用的引用计数(例如,一个典型的autoreleases)的使用相当宽松,切换到ARC 可以真正改善您的程序的执行时间和峰值内存使用情况。

你可以select在使用iOS 5.0 SDK进行开发时不使用ARC吗?

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

然而,混合模式(一些MRC和一些ARC源)是相当复杂的,并且微妙地,特别是可能由编译器复制的实现(例如,内联函数的主体可能是不正确的)。 这种混合模式的问题将很难隔离。 在这方面ObjC ++程序和源代码将特别困难。 此外,行为可能会根据您的优化设置而有所不同(如一个示例)。 在debugging版本中完美工作的程序可能会在发布时引入泄漏或僵尸。

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

就我个人而言,我会坚持MRC一段时间。 即使ARC已经在实际使用中进行过testing,但仍有许多问题出现在复杂场景中,您可能希望避免第一个知道和debugging。 OS X的垃圾收集是你为什么要等待的一个例子。 举一个例子,开关可以改变对象被销毁的时间 – 你的对象可能会被更快的销毁,永远不会被放置在自动释放池中。 它也可以改变ivars被释放的顺序,这可能会有一些副作用。

我也有一个大的代码库,我不想失去一个星期的时间来testing这个function。 最后,向后兼容性对我来说依然重要。

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

如果您使用MRC开发,它将向后兼容。 如果使用ARC进行开发,则不一定兼容。 事实上,如果没有一点额外的工作,它甚至不会编译。 运行时的要求在一些较早的版本中可用。 另见这个问题 。 如果您需要向后兼容性,ARC将不会成为某些操作系统版本的选项。

最后,如果你想限制selectGC或ARC,我会推荐ARC。

你用CLANG_ENABLE_OBJC_ARC = NOclosures/打开它, CLANG_ENABLE_OBJC_ARC = NO好处,你必须编写更less的代码和内存pipe理更容易。 缺点是,你必须抓住你所了解的内存pipe理的一切:)我宁愿关掉它。

你可以通过“Edit-> Refactor-> Convert to Objective C Arc”来打开ARC,这将完全重构你的代码(摆脱所有的内存pipe理调用等)。 没有反向操作,所以如果你有第二个想法,确保你有源代码pipe理的东西。 本文向您展示了如何为特定文件禁用它。 我认为没有太多的理由可以提出来,除非这样做令人伤心,因为看到所有将这些努力投入到良好的memory management中的事情都会消失殆尽,我们将不得不跳到最高限额每次我们看到初始化,新的,没有相应的释放/ autorelease复制(这将需要一些习惯)。 也许有人可能会认为,在某些情况下,手动内存pipe理会导致性能/内存占用的改善,如果可以的话,我也会感兴趣。

我正在使用Lion和xcode 4.3。 我有同样的问题。

为了解决这个问题,我把“Build Settings-> Objective-C自动引用公司”改为“No”。

为了看到它被设置为“是”,我还必须启用“构build设置”工具栏下方工具栏上的“全部”和“级别”选项。

一旦启用了这些选项,我可以看到我的项目将该选项设置为“是”。 我花了一段时间才知道默认设置是“否”,直到启用“级别”选项才显示出来。