Xcode ARC詳解全攻略
手動(dòng)管理內(nèi)存經(jīng)常忘掉release或autorelease,或者因?yàn)閞elease多了、retain少了導(dǎo)致空指針引用程序崩潰,還要經(jīng)常按COMMAND+SHIFT+B,豈止頭疼,簡(jiǎn)直蛋疼有木有。
雖然objective-c 2.0支持垃圾收集器(Garbage Collection,簡(jiǎn)稱GC),但是垃圾收集器只能在MAC程序上開(kāi)啟,ios上沒(méi)辦法用。就算在MAC應(yīng)用程序上可以用,GC也會(huì)有性能上的損耗。
現(xiàn)在LLVM3.0多了一個(gè)給力的新東西,叫Automatic Reference Counting。開(kāi)啟這個(gè)選項(xiàng)之后,LLVM會(huì)在編譯階段自動(dòng)幫開(kāi)發(fā)者完成“手動(dòng)”的內(nèi)存管理。同時(shí),所有代碼中的retain,release和 autorelease會(huì)被標(biāo)記成錯(cuò)誤,也就是說(shuō),我們完全不需要用以前頭蛋俱疼的方式管理內(nèi)存了。
ARC不僅可以修復(fù)錯(cuò)誤,還能增強(qiáng)性能。根據(jù)WWDC 2011大會(huì)的介紹,retain/release快了2.5倍,@autoreleasepool快了6倍,objc_msgSend快了33%。
一、舊工程開(kāi)啟ARC的方法
xCode4.2中已經(jīng)自帶了LLVM3.0,在用新的模板建立工程時(shí),編譯器默認(rèn)選擇LLVM3.0,并且開(kāi)啟ARC。如圖。
xCode4.2 也為ARC提供了自動(dòng)轉(zhuǎn)換工具。首先將工程的編譯器切換為L(zhǎng)LVM3.0,然后在菜單里選擇Edit—-Refactor—-Convert to Objective-C ARC…。LLVM會(huì)將不能轉(zhuǎn)換的部分標(biāo)記為錯(cuò)誤,要求我們手動(dòng)修改。一般NSAutoReleasePool不能自動(dòng)轉(zhuǎn)換,要手動(dòng)轉(zhuǎn)為 @autoreleasepool。CF框架的方法也不能自動(dòng)轉(zhuǎn)換,而release、retain和autorelease是可以自動(dòng)轉(zhuǎn)換的。我們將不 能自動(dòng)轉(zhuǎn)換的錯(cuò)誤手動(dòng)修改好后,編輯器將完成自動(dòng)轉(zhuǎn)換。
對(duì) 于可能出現(xiàn)的錯(cuò)誤,WWDC 2011的視頻中給出了一些例子。比如用static count來(lái)處理singletons pattern;用weak來(lái)申明delegate pattern;用dispatch_once來(lái)保證多線程的安全;在case關(guān)鍵字后面加上大括號(hào){..}來(lái)限制case里面申明變量的作用范圍等等。
二、開(kāi)啟ARC后需要遵循的原則
1、不能調(diào)用retain/release/autorelease,這些由編譯器來(lái)完成。
2、結(jié)構(gòu)內(nèi)不能有對(duì)象指針,如果結(jié)構(gòu)中包含,則需要以類代替結(jié)構(gòu)。
3、不能使用id<–>void *的類型轉(zhuǎn)換,因?yàn)榫幾g器不知道這個(gè)void *是否需要retained。
4、不能使用NSAutoreleasedPool,要用@autoreleasepool {……}來(lái)代替。
三、ARC中引入的四個(gè)新的關(guān)鍵字
1、Strong Reference,強(qiáng)引用。默認(rèn)類型,不加任何關(guān)鍵字(也可以寫(xiě)成__strong)。相當(dāng)于之前代碼中的retain屬性。
2、Autoreleasing Reference,自動(dòng)釋放引用。通常出現(xiàn)在例如系統(tǒng)error處理函數(shù)中(關(guān)鍵字__autoreleasing),描述out-parameters用,只保存在棧中,不太常用。
3、Unsafe Reference,不安全引用。類似于之前代碼中的assign屬性,不分配內(nèi)存(關(guān)鍵字__unsafe_unretained),相當(dāng)于起了個(gè)別名。
4、Weak Reference,弱引用。前面提到過(guò),不增加計(jì)數(shù),當(dāng)對(duì)象開(kāi)始釋放時(shí),立刻設(shè)置成nil。
四、ARC中循環(huán)引用造成內(nèi)存泄露的原因與解決辦法
ARC通過(guò)記錄指向某對(duì)象的指針數(shù)量來(lái)判斷該對(duì)象是否應(yīng)該被釋放(0代表可以釋放)。因而如果出現(xiàn)循環(huán)引用,就會(huì)出現(xiàn)內(nèi)存泄露。如下圖所示。
五、Instruments的Leaks的新功能
一篇深入討論 ARC的文章
http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/



























