ARC还是非ARC,iPhone iOS5?

7
我开发了一个iPhone应用程序,需要支持iOS4和iOS5的iPhone/iPad。
我的应用程序在几个地方泄漏内存,由于代码规模较大,这变得很难调试。我最近了解到ARC(自动引用计数),我的问题是:
1. 我需要修改源代码(retain/release/alloc/dealloc)才能使用ARC进行编译吗?还有什么其他更改需要使用ARC进行操作? 2. 是否建议转换到ARC? 3. 如果我使用ARC,我的应用程序是否可以在iOS4手机上运行?
谢谢。

我建议将这个问题作为维基条目......它绝对是一个好问题,而且肯定与编程有关,但大部分问题实际上是意见,并且涉及特定情况。 - Jason Coco
1
你在这里提出了三个不同的问题。第二个问题已经被 iOS 5最佳实践(释放/保留?) 解决,第三个问题则由 如果将项目转换为自动引用计数(ARC),它是否仍然支持iOS 3.X、4.X? 解答。 - Brad Larson
3个回答

14

另一个需要考虑的因素是许多第三方库尚未有良好的 ARC 版本。这使得我无法升级一些现有项目。 - Peter DeWeese
2
当您运行转换时,可以有选择性地从ARC中排除任何源文件。只需在ARC转换工具的预检阶段取消选中任何第三方类文件,它将跳过它们并使用-fno-objc-arc标记它们,以便从ARC验证中排除它们。这是ARC的最佳功能之一 - 您可以在同一项目中混合和匹配ARC和非ARC文件。 - Nick Lockwood

4
我认为程序员理解内存管理和系统实际工作原理是有益的......但是,我认为ARC是一个非常好的系统,并且运行得很好。这实际上是一个意见问题,所以我的意见是,除了在非常特定的情况下,几乎总是值得开始面向ARC的iOS 5应用的新项目。
如果你在代码中使用了很多C库,现在使用ARC会更困难一些(因此,如果你主要使用第三方C库和诸如CoreFoundation之类的东西,你可能需要考虑是否合理),但即使这样,如果这些库大多与你的Objective-C控制器等相互隔离,ARC仍然是好的。
对于旧应用程序,您需要查看您的应用程序使用情况和模式。如果您使用了很多委托方法,由于在iOS 4上无法使用弱引用,这会变得有点棘手,您可能必须使用混合ARC和非ARC代码。最好做出设计决策,前进使用ARC,因此将新功能设计为iOS 5专用功能,并且在应用程序的iOS 4版本中可能不可用(或完全可用)。
实际上,最终结果将取决于您的应用程序已经设计的方式、它的大小以及您对受管理的内存管理和ARC的使用/限制的熟悉程度。例如,我有三个项目永远不会转换为ARC,一个正在混合使用,一个已完全转换(但仍针对iOS 4+),还有两个完全采用ARC和面向iOS 5+。

OpenGL 技术上是一个 C API,虽然没有任何直接对象保留的需要,因此不需要“桥接”;所有对象都是内部和不透明的,并通过函数和整数 ID 访问。但是,在 ARC Obj-C 代码中使用 OpenGL 时需要注意什么? - Nicolas Miari

1
要明确的是,如果你的目标是iOS 4,那么你不能使用ARC弱引用,但是你仍然可以使用unsafe_unretained,它基本上相当于在对象属性中使用assign。这意味着你可以将任何良好编写的非ARC代码转换为ARC,而不会在iOS 4上意外创建保留循环。
通过使用unsafe_unretained,你失去了弱引用的自动空值特性,但你仍然可以获得ARC的所有其他好处,例如不必担心忘记在dealloc语句中释放ivars等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接