多數狀況下,Objective-C 對象和 Core Foundation 對象之間互相轉換時, 咱們都應該使用__bridge。可是有時候咱們確實須要給予 ARC 某個對象的全部權, 或者解除 ARC 對某個對象的全部權。這種狀況下咱們就須要使用另外兩種 bridging casts:web
__bridge_transfer:給予 ARC 全部權ide
__bridge_retained:解除 ARC 全部權函數
一旦 (__bridge_retained CFStringRef) 轉換完成,ARC 就再也不負責釋放該 對象。若是你在這裏使用 __bridge,應用就極可能會崩潰。ARC 可能在 Core Foundation 正在使用該對象時,釋放掉它。
spa
一樣__bridge_retained 也有一個輔助函數:CFBridgingRetain()。從名字 就能夠看出,這個函數會讓 Core Foundation 執行 retain,實際以下:指針
如今你應該明白了,上面例子的 CFRelease()是和 CFBridgingRetain()對應 的。你應該不多須要使用__bridge_retained 或 CFBridgingRetain()。orm
__bridge 轉換不單單侷限於 Core Foundation 對象,某些 API 使用 void * 指針做爲參數,容許你傳遞任何東西的引用:Objective-C 對象、Core Foundation 對象、malloc()內存緩衝區等等。void *表示這是一個指針,但實際的數據類型 能夠是任何東西!
對象
要將 Objective-C 對象和 void *互相轉換,你也須要使用__bridge 轉換, 以下:內存
在 animation delegate 方法中,你再將對象強制轉回來:animation
{it
}
總結:
使用 CFBridgingRelease(),從 Core Foundation 傳遞全部權給 Objective-C;
使用 CFBridgingRetain(),從 Objective-C 傳遞全部權給 Core Foundation;
使用__brideg,表示臨時使用某種類型,不改變對象的全部權。