你是否也曾被 assign、retain、copy、release、autorelease、strong、__strong、weak、__weak、__unsafe__unretain、__autoreleasing、__bridge、__bridge__transfer、__bridge__retained這些個 ARC 和非 ARC 之間的『禍害』搞的暈頭轉向,四肢無力,整我的都很差了。html
好吧,是時候來個了斷了。ios
一.認識到如下事實app
- ARC 是 LLVM 3.0 編譯器的一個新特性,它是編譯時特性而不是運行時特性,它所作的事情其實就是編譯程序的時候在之前須要手動管理內存的地方自動的爲你添加retain 和 release。
- ARC 的性能優於手動內存管理。可是它只適用於 Objective-C 對象,而 iOS 中基於 C 語言的 API 會用到 Core Foundation對象(CFxxxx),對於這些 CF 對象,依然須要手動內存管理。
- ARC 是 Objective-C 的必然趨勢,務必順勢而爲。
二.assign、retain、copy、release、autorelease
- assign,直接賦值,適用於 Int、BOOL、Float 等基本數據類型。若是是用在 Objective-C對象(指針)身上,如 NSString *a=b,則表示a 同時指向 b 指向的那一塊內存,可是引用計數不變。這樣會致使以下問題:當 b 指向的內存被釋放時,a 並不知情,a就成了野指針,程序崩潰。
- retain,用在Objective-C對象(指針)身上,賦值時指向同一塊內存,引用計數加一。很明顯,retain 不用於 Int、BOOL 等基本數據類型,也不能用於 CF 對象,緣由在於這些根本就沒有引用計數。
- copy,與 retain 的區別在於賦值時會從新開闢一塊新的內存並複製。
- release,引用計數減一,當引用計數爲0時就會釋放掉對應的內存。
- autorelease,在 autorelease pool 中自動 release 對象。
三.Strong、we
ak、__Strong、__weak、__unsafe__unretained、__autoreleasing
- Strong,iOS5.0以及 Mac OS X10.7以後引入的新特性,也便是在新的 SDK 中用 Strong 和 weak 來表示強引用和弱引用。Strong 至關於前面的 retain。Strong 的含義是隻要還有指針指向它,那麼這個對象就一直活着,內存不會被釋放。Strong 用於聲明屬性(property),而__Strong用於聲明實例變量和局部變量,默認狀況下實例變量和局部變量都是 strong 型的,因此你不須要再聲明一遍。
- Weak,對應於以前的 assign,弱引用,若是指向的對象被釋放,那麼指針被置爲 nil。__weak用於實例變量和局部變量。
- 在使用 strong 時,可能會致使retain cycle。例如,你擁有一個對象包含了另外了一個實例變量對象,可是第二個對象又把前一個對象做爲它的委託,那麼這兩個對象將不會被釋放。因此須要把 delegate 設爲 weak。
- __unsafe__unretained,相似於__weak,差異在於,當所指向的對象被釋放時,__unsafe__unretained 修飾的指針不會被置爲nil 而會成爲野指針,正如它的名字 unsafe 所暗示的。這是應該極力避免的。但爲何還要用__unsafe__unretained 呢,由於__weak 是 iOS5之後纔出現的。
- __autoreleasing 的英文解釋爲:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用傳參時使用。
四.__bridge、__bridge__transfer、__bridge__retained
- 在 Objective-C 對象和 CF 對象之間轉換的時候須要用到 bridge cast.
- 當你要臨時的使用一個類型,而不想要更改全部關係時, 你要使用 __bridge。轉換值 = 原變量指針; (原變量若是釋放, 轉換值也就不能使用了)
- 當把全部關係從 Core Foundation 轉換到 Objective-C 的時候, 你要使用 CFBridgingRelease(),也就是__bridge__transfer。把內存管理的權利從 CF 轉交給 ARC。全部你調用名稱含有 Create,Copy 或 Retain 的 Core Foundation 函數的地方, 你都必須使用 CFBridgingRelease() 來將返回值轉移到 ARC 中。
- 當把全部關係從 Objective-C 轉換到 Core Foundation 的時候,你要使用 CFBridgingRetain(),也就是__bridge__retained。把內存管理的權利從 ARC 轉爲 CF,這時須要手動內存管理也便是在使用完 CF 對象以後調用 CFRelease()。
- Notes:
- 不是全部的 Objective-C 和 Core Foundation對象都是能夠直接轉換(toll-free bridged)的。例如, CGImage 和 UIImage 就不能互相轉換, CGcolor 和 UIColor 也不能。這裏列出了全部可以相互轉換的類型。
- __bridge 轉換,不只限於 Core Foundation,也用於 一些API 使用 的void * 類型的指針, 可讓你存聽任何類型的引用。
原文地址:http://blog.csdn.net/zhuiyi316/article/details/23794471函數
總結很不錯,怕做者刪了,拷過來以記之性能