OC裏ARC中的強引用和弱引用

ARC是什麼?

       ARC是從iOS開始推出的功能,全稱是ARC(Automatic Reference Counting)。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。

       該機能在iOS 5/Mac OS X 10.7 開始導入,利用Xcode4.2及以上版本可以使用該機能。簡單地理解ARC,就是通過指定的語法,讓編譯器(LLVM 3.0)在編譯代碼時,自動生成實例的引用計數管理部分代碼。有一點,ARC並不是GC,它只是一種代碼靜態分析(Static Analyzer)工具。

ARC中的強引用,強引用的工作機制可以見下圖:


(s1) firstName作爲”natsu”字符串對象的最初持有者,是該NSString類型對象的Strong reference。
(s2) 這裏將firstName代入到aName中,即aName也成爲了@”natsu”字符串對象的持有者,對於該對象,aName也是Strongreference。
(s3) 這裏,改變firstName的內容。生成新的字符串對象”maki”。這時候firstName成爲”maki”的持有者,而@”natsu”的持有者只有aName。每個字符串對象          都有各自的持有者,所以它們都在內存中都存在。
(s4) 追加新的變量otherName, 它將成爲@”maki”對象的另一個持有者。即NSString類型對象的Strong reference。
(s5) 將otherName代入到aName,這時,aName將成爲@”maki”字符串對象的持有者。而對象@”natsu”已經沒有持有者了,該對象將被拋棄。

ARC中的弱引用,弱引用的工作機制可以見下圖:


(w1) 與強參照方式同樣,firstName作爲字符串對象@”natsu”的持有者存在。即是該NSString類型對象的Strong reference。

(w2) 使用關鍵字__weak,聲明弱參照weakName變量,將firstName代入。這時weakName雖然參照@”natsu”,但仍是Weakreference。即weakName雖然           能看到@”natsu”,但不是其持有者。

(w3) firstName指向了新的對象@”maki”,成爲其持有者,而對象@”natsu”因爲沒有了持有者,即被破棄。同時weakName變量將被自動代入nil。

使用ARC的一些強制規定

1.不能直接調用dealloc方法,不能調用retain,release,autorelease,retainCount方法,包括@selector(retain)的方式也不行

2.如果你需要管理資源而不是釋放實例變量,你應該實現dealloc方法。不能在dealloc方法裏面去掉[super 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)
9.不能以new爲開頭給一個屬性命名

10.聲明outlet時一般應當使用weak,除了對StoryBoard這樣nib中間的頂層對象要用strong11.weak相當於老版本的assign,strong相當於retain 

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章