自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Xcode ARC詳解全攻略

移動開發(fā) iOS
ios5中,有個很吸引眼球的特性就是“Automatic Reference Counting”,簡單來說就是內(nèi)存自動回收,看起來似乎是平時開發(fā)中遇到的各種內(nèi)存問題的福音,仔細(xì)了解了一下,似乎沒有那么美好:1、需要iOS5才支持;2、很多引用的類庫暫時還不支持.麻煩的是對大多數(shù)第三方庫需要加禁用arc的編譯flag,因為大多都因為兼容性還在使用手動內(nèi)存管理。
iOS上內(nèi)存管理一直讓人很頭疼.

手動管理內(nèi)存經(jīng)常忘掉release或autorelease,或者因為release多了、retain少了導(dǎo)致空指針引用程序崩潰,還要經(jīng)常按COMMAND+SHIFT+B,豈止頭疼,簡直蛋疼有木有。

雖然objective-c 2.0支持垃圾收集器(Garbage Collection,簡稱GC),但是垃圾收集器只能在MAC程序上開啟,ios上沒辦法用。就算在MAC應(yīng)用程序上可以用,GC也會有性能上的損耗。

現(xiàn)在LLVM3.0多了一個給力的新東西,叫Automatic Reference Counting。開啟這個選項之后,LLVM會在編譯階段自動幫開發(fā)者完成“手動”的內(nèi)存管理。同時,所有代碼中的retain,release和 autorelease會被標(biāo)記成錯誤,也就是說,我們完全不需要用以前頭蛋俱疼的方式管理內(nèi)存了。

ARC不僅可以修復(fù)錯誤,還能增強(qiáng)性能。根據(jù)WWDC 2011大會的介紹,retain/release快了2.5倍,@autoreleasepool快了6倍,objc_msgSend快了33%。

一、舊工程開啟ARC的方法

xCode4.2中已經(jīng)自帶了LLVM3.0,在用新的模板建立工程時,編譯器默認(rèn)選擇LLVM3.0,并且開啟ARC。如圖。

xCode4.2 也為ARC提供了自動轉(zhuǎn)換工具。首先將工程的編譯器切換為LLVM3.0,然后在菜單里選擇Edit—-Refactor—-Convert to Objective-C ARC…。LLVM會將不能轉(zhuǎn)換的部分標(biāo)記為錯誤,要求我們手動修改。一般NSAutoReleasePool不能自動轉(zhuǎn)換,要手動轉(zhuǎn)為 @autoreleasepool。CF框架的方法也不能自動轉(zhuǎn)換,而release、retain和autorelease是可以自動轉(zhuǎn)換的。我們將不 能自動轉(zhuǎn)換的錯誤手動修改好后,編輯器將完成自動轉(zhuǎn)換。

對 于可能出現(xiàn)的錯誤,WWDC 2011的視頻中給出了一些例子。比如用static count來處理singletons pattern;用weak來申明delegate pattern;用dispatch_once來保證多線程的安全;在case關(guān)鍵字后面加上大括號{..}來限制case里面申明變量的作用范圍等等。

二、開啟ARC后需要遵循的原則

1、不能調(diào)用retain/release/autorelease,這些由編譯器來完成。

2、結(jié)構(gòu)內(nèi)不能有對象指針,如果結(jié)構(gòu)中包含,則需要以類代替結(jié)構(gòu)。

3、不能使用id<–>void *的類型轉(zhuǎn)換,因為編譯器不知道這個void *是否需要retained。

4、不能使用NSAutoreleasedPool,要用@autoreleasepool {……}來代替。

三、ARC中引入的四個新的關(guān)鍵字

1、Strong Reference,強(qiáng)引用。默認(rèn)類型,不加任何關(guān)鍵字(也可以寫成__strong)。相當(dāng)于之前代碼中的retain屬性。

2、Autoreleasing Reference,自動釋放引用。通常出現(xiàn)在例如系統(tǒng)error處理函數(shù)中(關(guān)鍵字__autoreleasing),描述out-parameters用,只保存在棧中,不太常用。

3、Unsafe Reference,不安全引用。類似于之前代碼中的assign屬性,不分配內(nèi)存(關(guān)鍵字__unsafe_unretained),相當(dāng)于起了個別名。

4、Weak Reference,弱引用。前面提到過,不增加計數(shù),當(dāng)對象開始釋放時,立刻設(shè)置成nil。

四、ARC中循環(huán)引用造成內(nèi)存泄露的原因與解決辦法

ARC通過記錄指向某對象的指針數(shù)量來判斷該對象是否應(yīng)該被釋放(0代表可以釋放)。因而如果出現(xiàn)循環(huán)引用,就會出現(xiàn)內(nèi)存泄露。如下圖所示。

 取消3->2的引用   導(dǎo)致泄露。

ARC的解決辦法也和簡單,使用弱引用(weak reference)。弱引用的申明方式舉例如下:
id __weak P;
@property (weak) NSVIew *V;
還是以上面的例子做對比,結(jié)果如下:

 弱引用不增加計數(shù), 從而消除leak。

五、Instruments的Leaks的新功能

這張圖里面就標(biāo)識出了整個leak cycle的全景圖。點擊cycle graph中的紅色箭頭,就會自動跳到code中對應(yīng)的變量聲明處,根據(jù)情況加上weak關(guān)鍵字就解決leak了。
在新舊技術(shù)更替的更年期應(yīng)注意:現(xiàn)在ARC還under NDA,沒有任何開源框架可以公開支持ARC的,如果想使用此特性,在選取開源框架時應(yīng)該盡量選擇使用CF庫較少的框架,否則手動爆開源框架的菊花會很痛苦。


一篇深入討論 ARC的文章

http://longweekendmobile.com/2011/09/07/objc-automatic-reference-counting-in-xcode-explained/

責(zé)任編輯:閆佳明 來源: blog.163
相關(guān)推薦

2011-10-31 14:44:49

2024-05-07 09:01:21

Queue 模塊Python線程安全隊列

2013-06-08 11:13:00

Android開發(fā)XML解析

2010-04-23 14:04:23

Oracle日期操作

2014-03-19 17:22:33

2009-12-14 14:32:38

動態(tài)路由配置

2009-10-19 15:20:01

家庭綜合布線

2009-02-20 11:43:22

UNIXfish全攻略

2009-02-12 10:12:00

NAT配置

2009-07-17 17:43:49

Jruby開發(fā)Web

2020-11-23 15:21:12

Linux環(huán)境變量

2009-12-17 16:15:00

CCNA640-810

2010-08-25 14:36:02

DHCP服務(wù)器

2019-06-27 11:47:21

Wordpress容器化HTTPS

2024-10-25 15:25:42

2009-11-10 12:08:15

2020-12-28 10:50:09

Linux環(huán)境變量命令

2009-10-12 15:06:59

2022-10-21 11:30:42

用戶生命周期分析

2015-03-04 13:53:33

MySQL數(shù)據(jù)庫優(yōu)化SQL優(yōu)化
點贊
收藏

51CTO技術(shù)棧公眾號