2014年4月9日 星期三

iOS記憶體相關-ARC相關

ARC:Automatic Reference Counting,自動引用計數。

1. iOS5(WWDC2011)之後提供。

2. ARC是新的LLVM 3.0編譯器的一項特性,透過編譯器使用靜態的方式全自動管理記憶體,開發者不需要再手動管理。

3. 原本管理記憶體時需要使用的retain,release和autorelease三個關鍵字都不再需要,這是使用ARC的基本原則。當ARC開啟時,編譯器將自動在程式合適的地方插入retain, release和autorelease

4. Property相關:
(1) strong:和原來的retain比較相似,strong的property將對應__strong的指標,它將持有所指向的對象
(2) weak:不持有所指向的對象,而且當所指對象銷毀時能將自己置為nil,基本所有的outlet都應該用weak
(3) unsafe_unretained:這就是原來的assign。當需要支援舊版的iOS時需要用到這個關鍵字。
(4) copy:和原來基本一樣,copy一個對象並且為其創建一個strong指標。
(5) assign:對於object來說應該永遠不用assign了,實在需要的話應該用unsafe_unretained代替(基本找不到這種時候,大部分assign應該都被weak替代)。但是對於基本類型比如int,float,BOOL這樣的東西,還是要用assign。

使用的大原則: 只要某個物件被任一strong指標指向,那麼它將不會被銷毀。如果對象沒有被任何strong指標指向,那麼就將會被ARC自動銷毀。

5. ARC的缺點:如果涉及到較為底層的東西,比如Core Foundation中的malloc()或者free()等,ARC就鞭長莫及了,這時候還是需要自己手動進行記憶體管理。

6. 與ARC比較:使用MRC的原則

每個物件或對象都有一個Reference Counting,當值變成0之後就可以進行記憶體回收,但如果操作不當可能會造成程式Crash,例如當Reference Counting=1時,就進行dealloc,因此Programmer進行記憶體管理時需特別注意。

如果需要持有一個物件或對象,那麼對其發送retain 後如果之後不再使用該對象,那麼需要對其發送release(或者autorealse) 每一次對retain,alloc或者new的調用,需要對應一次release或autorealse調用。

retain = Reference Counting +1
release = Reference Counting -1

即Object(1)-> Object(2)->Object(1)->Object(0)->dealloc
       retain          retain         Release      Release

7. 其他:Xcode內建提供了一個ARC自動轉換工具,可以幫助你自動將MRC轉為ARC
當然也可以自己動手完成ARC轉換,另外Xcode也支援專案同時將ARC與MRC混編。

沒有留言:

張貼留言