我和身边做 iOS 开发的同事组建了一个 QQ 群,每隔一段时间,大家就会讨论是否应该使用 ARC。所以我觉得有必要将这些讨论分享出来,让大家消除对于 ARC 的疑虑。
关于 ARC 的介绍文章网上已经很多,苹果的官方文档也不少。担心使用 ARC 会带来问题的同学主要的理由有以下 5 点:
- 担心这个技术方案不靠谱。苹果大多数时候的技术方案都是比较靠谱的,但也有一些技术方案有很多坑,例如 storyboard。关于 storyboard 的问题可以参看我的 这篇文章。
- 原有的项目在非 ARC 环境下运行良好,担心迁移成本或引入新的问题。
- 苹果以前手工管理内存需要非常小心,稍微不注意应用程序就崩溃了。有过这段经历的 iOS 开发老手,心里上还是觉得自己手工管理内存更踏实一些。
- 使用 ARC 需要了解 ARC 的一些细节,还需要引入 _bridge 等新的关键字,学习成本还是有的。
- 以为 ARC 只能支持 iOS5.0 以上(这是非常大的误解)。
对于上面提到 5 点问题,我认为相应的回答如下:
- ARC 是 WWDC2011 大会时提出的技术,离现在已经快 2 年了,而且苹果现在将 MacOS 上的垃圾回收机制废弃 (Deprecated),采用 ARC 替代,无疑证明了 ARC 是成熟的了。
- 确实有一些迁移成本,但苹果在 Xcode 中专门集成了迁移工具,成本已经非常小了。如下图就是 Xcode 集成的将非 ARC 工程转换成 ARC 工程的工具。另外,为了兼容第三方的非 ARC 开源库,你也可以在工程中随意使用编译参数:
-fno-objc-arc
, 这个参数允许对部分文件关闭 ARC。 - 手工管理内存虽然踏实,但是泄露很容易发生。常常开发完成后,需要使用 Instruments 来检测泄露。但用了 ARC 后,基本不会出现泄露了,我在开发粉笔网 iPhone 客户端时,由于使用了 ARC,花三个月开发完的应用,用 instruments 检测后,没有发现任何内存泄漏问题。这在没有使用 ARC 的工程中是不可想象的。
- 确实有学习成本。但是非常值得学习,能省不少开发精力。
- 虽然 ARC 是与 iOS5 一同推出,但是由于 ARC 的实现机制是在编译期完成,所以使用 ARC 之后 App 仍然可以支持 iOS4.3。稍微需要注意的是,如果要在 ARC 开启的情况下支持 iOS4.3,需要将 weak 关键字换成 __unsafe_unretained,另外还有一些细节需要处理,在这里我就不展开说了。
所以,希望大家都能在项目中使用 ARC,一旦你感受到它带来的好处,你就离不开它了。它也能让你从繁琐的内存管理代码中解放出来,将精力更多关注于代码结构、设计模式而不是底层的内存管理。
关于 ARC 的教程,除了苹果的官方文档外,推荐易飞杨写的 ARC 相关的文章(注:链接需要翻墙才能打开)。易飞杨的博客中关于 iPhone 开发的文章都写得很深入,值得好好阅读。