iOS開發(fā)是否應(yīng)該使用ARC?
和身邊做iOS開發(fā)的同事組建了一個QQ群,每隔一段時間,大家就會討論是否應(yīng)該使用ARC。所以我覺得有必要將這些討論分享出來,讓大家消除對于ARC的疑慮。
關(guān)于ARC的介紹文章網(wǎng)上已經(jīng)很多,蘋果的官方文檔也不少。擔(dān)心使用ARC會帶來問題的同學(xué)主要的理由有以下5點:
1.擔(dān)心這個技術(shù)方案不靠譜。蘋果大多數(shù)時候的技術(shù)方案都是比較靠譜的,但也有一些技術(shù)方案有很多坑,例如storyboard。關(guān)于storyboard的問題可以參看我的這篇文章。
2.原有的項目在非ARC環(huán)境下運行良好,擔(dān)心遷移成本或引入新的問題。
3.蘋果以前手工管理內(nèi)存需要非常小心,稍微不注意應(yīng)用程序就崩潰了。有過這段經(jīng)歷的iOS開發(fā)老手,心里上還是覺得自己手工管理內(nèi)存更踏實一些。
4.使用ARC需要了解ARC的一些細(xì)節(jié),還需要引入_bridge等新的關(guān)鍵字,學(xué)習(xí)成本還是有的。
5.以為ARC只能支持iOS5.0以上(這是非常大的誤解)。
對于上面提到5點問題,我認(rèn)為相應(yīng)的回答如下:
1.ARC是WWDC2011大會時提出的技術(shù),離現(xiàn)在已經(jīng)快2年了,而且蘋果現(xiàn)在將MacOS上的垃圾回收機制廢棄(Deprecated),采用ARC替代,無疑證明了ARC是成熟的了。
2.確實有一些遷移成本,但蘋果在Xcode中專門集成了遷移工具,成本已經(jīng)非常小了。如下圖就是Xcode集成的將非ARC工程轉(zhuǎn)換成ARC工程的工具。另外,為了兼容第三方的非ARC開源庫,你也可以在工程中隨意使用編譯參數(shù):-fno-objc-arc ,這個參數(shù)允許對部分文件關(guān)閉ARC。
3.手工管理內(nèi)存雖然踏實,但是泄露很容易發(fā)生。常常開發(fā)完成后,需要使用Instruments來檢測泄露。但用了ARC后,基本不會出現(xiàn)泄露了,我在 開發(fā)粉筆網(wǎng)iPhone客戶端時,由于使用了ARC,花三個月開發(fā)完的應(yīng)用,用instruments檢測后,沒有發(fā)現(xiàn)任何內(nèi)存泄漏問題。這在沒有使用 ARC的工程中是不可想象的。
4.確實有學(xué)習(xí)成本。但是非常值得學(xué)習(xí),能省不少開發(fā)精力。
5.雖然ARC是與iOS5一同推出,但是由于ARC的實現(xiàn)機制是在編譯期完成,所以使用ARC之后App仍然可以支持iOS4.3。稍微需要注意的是, 如果要在ARC開啟的情況下支持iOS4.3,需要將weak關(guān)鍵字換成 __unsafe_unretained,另外還有一些細(xì)節(jié)需要處理,在這里我就不展開說了。

所以,希望大家都能在項目中使用ARC,一旦你感受到它帶來的好處,你就離不開它了。它也能讓你從繁瑣的內(nèi)存管理代碼中解放出來,將精力更多關(guān)注于代碼結(jié)構(gòu)、設(shè)計模式而不是底層的內(nèi)存管理。