文章目录

我和身边做 iOS 开发的同事组建了一个 QQ 群,每隔一段时间,大家就会讨论是否应该使用 ARC。所以我觉得有必要将这些讨论分享出来,让大家消除对于 ARC 的疑虑。

关于 ARC 的介绍文章网上已经很多,苹果的官方文档也不少。担心使用 ARC 会带来问题的同学主要的理由有以下 5 点:

  1. 担心这个技术方案不靠谱。苹果大多数时候的技术方案都是比较靠谱的,但也有一些技术方案有很多坑,例如 storyboard。关于 storyboard 的问题可以参看我的 这篇文章
  2. 原有的项目在非 ARC 环境下运行良好,担心迁移成本或引入新的问题。
  3. 苹果以前手工管理内存需要非常小心,稍微不注意应用程序就崩溃了。有过这段经历的 iOS 开发老手,心里上还是觉得自己手工管理内存更踏实一些。
  4. 使用 ARC 需要了解 ARC 的一些细节,还需要引入 _bridge 等新的关键字,学习成本还是有的。
  5. 以为 ARC 只能支持 iOS5.0 以上(这是非常大的误解)。

对于上面提到 5 点问题,我认为相应的回答如下:

  1. ARC 是 WWDC2011 大会时提出的技术,离现在已经快 2 年了,而且苹果现在将 MacOS 上的垃圾回收机制废弃 (Deprecated),采用 ARC 替代,无疑证明了 ARC 是成熟的了。
  2. 确实有一些迁移成本,但苹果在 Xcode 中专门集成了迁移工具,成本已经非常小了。如下图就是 Xcode 集成的将非 ARC 工程转换成 ARC 工程的工具。另外,为了兼容第三方的非 ARC 开源库,你也可以在工程中随意使用编译参数:-fno-objc-arc , 这个参数允许对部分文件关闭 ARC。
  3. 手工管理内存虽然踏实,但是泄露很容易发生。常常开发完成后,需要使用 Instruments 来检测泄露。但用了 ARC 后,基本不会出现泄露了,我在开发粉笔网 iPhone 客户端时,由于使用了 ARC,花三个月开发完的应用,用 instruments 检测后,没有发现任何内存泄漏问题。这在没有使用 ARC 的工程中是不可想象的。
  4. 确实有学习成本。但是非常值得学习,能省不少开发精力。
  5. 虽然 ARC 是与 iOS5 一同推出,但是由于 ARC 的实现机制是在编译期完成,所以使用 ARC 之后 App 仍然可以支持 iOS4.3。稍微需要注意的是,如果要在 ARC 开启的情况下支持 iOS4.3,需要将 weak 关键字换成 __unsafe_unretained,另外还有一些细节需要处理,在这里我就不展开说了。

所以,希望大家都能在项目中使用 ARC,一旦你感受到它带来的好处,你就离不开它了。它也能让你从繁琐的内存管理代码中解放出来,将精力更多关注于代码结构、设计模式而不是底层的内存管理。

关于 ARC 的教程,除了苹果的官方文档外,推荐易飞杨写的 ARC 相关的文章(注:链接需要翻墙才能打开)。易飞杨的博客中关于 iPhone 开发的文章都写得很深入,值得好好阅读。