2012-01-05 48 views
7

我开发了一个iPhone应用程序,它应该支持基于iOS4和iOS5的iPhone/iPad。ARC或不是ARC的iPhone iOS5

由于代码的大小,我的应用程序在几个难以调试的地方泄漏内存。我最近读到ARC(自动引用计数),我的查询是

  1. 我需要修改我的源代码(保留/释放/分配/ dealloc的)编译与ARC。 还有我们需要使用ARC执行的所有更改?

  2. 建议转向ARC吗?

  3. 将我的iOS4手机上的应用程序的工作,如果我使用ARC

感谢。

+0

我建议将此问题作为wiki条目......这绝对是一个很好的问题,绝对是编程相关的,但绝大多数的问题是真正的意见,并与具体情况有关。 – 2012-01-05 20:35:42

+1

你在这里问三个不同的问题。第二种是[iOS 5 Best Practice(Release/retain?)](http://stackoverflow.com/questions/6308425/ios-5-best-practice-release-retain)所涵盖的,第三种是[if convert项目自动引用计数(ARC),它仍然支持iOS 3.X,4.X?](http://stackoverflow.com/questions/6421753/if-convert-project-to-automatic-reference-countingarc -is-it-still-support-on) – 2012-01-05 23:57:32

回答

14

这可能不是发布这个问题的最佳地方,但我会回答,因为我不介意这里的问题。

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

  1. 您将使用迁移工具“编辑>重构>转换成Objective-C的ARC”和手解决任何工具想不通。

  2. 是。

  3. 是的,但归零弱引用不会。

+0

另一个需要考虑的是许多第三方库还没有很好的弧形版本。这使我无法升级我的一些现有项目。 – 2012-01-05 20:46:09

+2

运行转换时,您可以选择性地排除ARC中的任何源文件。只需在ARC转换工具预检检查阶段取消勾选任何第三方类文件,它将跳过它们并用-fno-objc-arc标记,以便将它们从ARC验证中排除。这是ARC的最佳功能之一 - 您可以在同一个项目中混合使用ARC和非ARC文件。 – 2012-01-05 23:49:47

4

我绝对认为这是很好的程序员理解内存管理以及系统如何实际工作...但是,我认为ARC是一个非常好的系统和作品真的很好。这实际上是一个意见问题,所以我的看法是,除了非常特殊的情况外,几乎总是有必要启动将针对iOS上iOS 5应用程序的新项目。

我觉得如果你在代码中使用了很多C库,ARC现在有点难以使用了(所以如果你主要使用第三方C库和CoreFoundation之类的东西,你可能会考虑它是否有意义),但即使如此,如果这些库大部分都与Objective-C控制器隔离开来,那么ARC仍然很好。

对于较旧的应用程序,您需要查看应用程序的使用情况和模式。如果你使用了很多委托方法,因为你不能在iOS 4上使用弱引用,它会变得更加棘手,你可能需要混合使用ARC和非ARC代码。做一个设计决定来推进ARC可能会更好。因此,新功能是为iOS 5设计的,可能在应用程序的iOS 4版本中不可用(或完全可用),并且使用ARC。

真的,最终,它将取决于您的应用程序已经设计好了,它有多大,以及管理内存管理和ARC的使用/限制有多舒适。例如,我有三个我从未转换为ARC的项目,一个是我现在正在混合使用的项目,一个是完全转换(但仍以iOS 4+为目标),另外两个是ARC和iOS 5+只要。

+0

OpenGL在技术上是C API,尽管没有任何直接的对象保留,因此不需要'桥接';所有对象都是内部的和不透明的,并通过函数和整数ID进行访问。但是,在ARC Obj-C代码中使用OpenGL时还有什么需要注意的吗? – 2012-06-19 20:15:14

1

需要明确的是,虽然你不能使用ARC弱引用,如果你的目标的iOS 4,您可以仍然使用unsafe_unretained,这基本上是使用assign为对象属性的等价物。这意味着您可以将任何编写良好的非ARC代码转换为ARC,而不会在iOS 4上意外创建保留周期。

通过使用unsafe_unretained,您将失去弱引用的自动归零功能,但仍然会获得ARC的所有其他好处,例如不必担心忘记在dealloc语句中释放ivars等。