Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)

love_hot_girl發表於2020-04-07
 

Automatic Reference Counting(ARC)特性學習(iOS5新特性學習之五)

分類: iOS5新特性學習 記憶體管理 670人閱讀 評論(1) 收藏 舉報

首先,先不談ARC,先上一張圖,弄清楚iOS下記憶體管理的基本原理:


    這就是手動記憶體管理的原理,通過對物件應用的計數來判斷何時(計數為0時)銷燬物件,現在ARC自動為你做了這一切,當然,ARC是在編譯的時候自動在目的碼裡面恰當的地方加了一些retain, release, 和autorelease語句而已。所以,如果使用ARC來進行記憶體管理,則可以把關注點更多地放在程式碼邏輯等方面,而不用牽絆於記憶體地釋放等問題了。下面談談應用ARC的一些規則:

1、關於ARC的適用範圍:只能在iOS4和iOS5上使用,如果使用了weak references,就只能在iOS5上使用了。

2、Apple推薦在所有的新工程中使用ARC來進行記憶體管理,針對老的應用,XCode4.2也提供了一個工具來進行轉換(Edit-Refactor-Convert to Objective-ARC)。轉換的規則包括:

(1)去掉所有的retain、release、autorelease

(2)把 NSAutoReleasePool替換為@autoreleasepool {}塊

(3)把@property(assign)變為@property(weak)

3、使用ARC的若干強制性規定

(1)不能顯式地呼叫dealloc方法,不能實現或呼叫retain, release, retainCount或者autorelease方法。當然,包括使用@selector(retain)這樣的方式來呼叫也不行。

(2)可以自己實現一個dealloc方法來管理一些資源,但不不能用來釋放例項變數,注意自定義dealloc方法式不要去呼叫[super dealloc],即父類的dealloc方法,否則會引起編譯錯誤。在ARC下,對父類的dealloc同樣有編譯器來自動完成。

(3)對於Core Foundation型別的物件來說(基本型別),仍然可以使用CFRetain, CFRelease這些方法

(4)不能夠再使用NSAllocateObject和NSDeallocateObject物件

(5)不能都在C結構體中使用物件指標,如果要實現類似的功能,可以建立一個Objective-C類來管理這些物件。

(6)在id和void *之間沒有簡便的轉換方法,同樣的,在Objective-C物件和Core Foundation型別之間的轉換都需要使用編譯器指定的轉換函式。

(7)不能再使用NSAutoreleasePool物件了,ARC提供了@autoreleasepool塊來替代它,這會更加有效率。

(8)不能使用記憶體儲存區了,即不能再使用NSZone,這早已是被Objective-C的執行時拋棄的東西

(9)不能以new為開頭來給一個property命名

(10)宣告outlet時,一般都應當使用weak,除了對StoryBoard Segue這樣nib中間中的頂層物件,就要用strong了。

4、對工程中的單個檔案指定不使用arc的方法:在targets的build phases選項下Compile Sources下選擇要不使用arc編譯的檔案,雙擊它,輸入-fno-obj-arc即可,如下圖:


參考文章:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html#//apple_ref/doc/uid/TP40011226

                    http://clang.llvm.org/docs/AutomaticReferenceCounting.html

相關文章