天天看點

OC文法--__unsafe_unretain、__strong、__weak、__autoreleasing的作用

nomantic、copy、retain等屬性見前面的文章

今天看__unsafe_unretain、__strong、__weak、__autoreleasing這四種屬性

__unsafe_unretain、__strong、__weak、__autoreleasing是出現在 LLVM 編譯器 3.0版本之後。

而__unsafe_unretain、__strong、__autoreleasing可以在不使用ARC(自動參考計數)可用。

在ARC下,預設的指針都是__strong屬性。這意味着一個對象指派給另外一個指針,那麼隻要指針參考了該對象,該對象就會一直保持。這對于大部分對象都實用,但是這可能會導緻retain cycle。例如,你擁有一個對象包含了另外了一個執行個體變量對象,但是第二個對象又把前一個對象作為它的委托,那麼這兩個對象将不會被釋放。

因為上面的原因,是以才有了__unsafe_unretain和__weak限定符存在。他們通常用來修飾delegate,即定義一個delegate的屬性時,使用__unsafe_unretain和__weak來修飾,然後通過使用__unsafe_unretain和__weak來單獨标記執行個體變量。這意味着delegate執行個體變量将仍然能夠指向第一個對象,但是它不會導緻保留第一個對象,是以打破了retain cycle,而能夠釋放兩個對象。

除了delegate,__unsafe_unretain和__weak修飾符也還能避免你的代碼出現retain cycle。Leaks instrument現在包含了一個cycle視圖,能夠發現你的應用中的retain cycle,并圖像顯示出來。

__unsafe_unretain和__weak都能避免retain cycle,但是他們也有一些細微的不同。對于__weak,當釋放指針指向的對象時,該對象的指針将轉換為nil,這是比較安全的行為。而__unsafe_unretain,正如其名稱隐藏的含義,盡管釋放指針指向的對象時,該指針将繼續指向原來的記憶體。這将會導緻應用crash,是以是unsafe。

為什麼我們仍要使用__unsafe_unretain呢?這是因為__weak直到iOS5.0以及lion之後才出現。

而__autoreleasing 的英文解釋為:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用傳參時使用。

最後需要注意的一點是:cocoa設定了一個規則,即父對象建立子對象的強引用,而子對象隻對父對象建立弱引用。

繼續閱讀