Core Foundation對象主要使用在用C語言編寫的Core Foundation框架中倡勇,并使用引用計數(shù)。
Core Foundation框架和Foundation框架緊密相關(guān)摔寨,它們?yōu)橄嗤δ芴峁┙涌谛髂欤獸oundation框架提供Objective-C接口。如果您將Foundation對象和Core Foundation類型摻雜使用掩驱,則可利用兩個框架之間的 toll-free bridging
潘靖。所謂的Toll-free bridging
是說您可以在某個框架的方法或函數(shù)同時使用Core Foundatio和Foundation 框架中的某些類型穿剖。很多數(shù)據(jù)類型支持這一特性,其中包括群體和字符串數(shù)據(jù)類型卦溢。每個框架的類和類型描述都會對某個對象是否為toll-free bridged
糊余,應(yīng)和什么對象橋接進行說明。
ARC僅管理Objective-C指針(retain
单寂、release
贬芥、autorelease
),不管理CoreFoundation指針宣决,Core Foundation框架中的retian/release
分別是CFRetian/CFRelease
,使用CFGetRetainCount
來獲取retainCount
蘸劈。注,Core Foundation中沒有autorelease
尊沸。
例子:
CFMutableArrayRef cfObject = NULL;
{
id obj = [[NSMutableArray alloc]init];
cfObject = (__bridge_retained CFMutableArrayRef) obj;
CFShow(cfObject);
printf("retain count = %d\n",CFGetRetainCount(cfObject));
}
printf("retain count after the scope = %d\n",CFGetRetainCount(cfObject));
CFRelease(cfObject);
源代碼正常運行后威沫,輸出一下結(jié)果,()代表空數(shù)組
(
)
retain count = 2
retain count after the scope = 1
Toll-free Bridging
CocoaFoundation指針與CoreFoundation指針轉(zhuǎn)換洼专,需要考慮的是所指向?qū)ο笏袡?quán)的歸屬棒掠。ARC提供了3個修飾符來管理。
-
__bridge
:什么都不做屁商,只是轉(zhuǎn)換- 從Foundation轉(zhuǎn)到Core Foundation烟很,需要人工CFRetain,否則蜡镶,F(xiàn)oundation指針釋放后雾袱, 傳出去的指針則無效。
- 從Core Foundation轉(zhuǎn)換到Foundation官还,需要人工CFRelease芹橡,否則,F(xiàn)oundation指針釋放后妻枕,對象引用計數(shù)仍為1僻族,不會被銷毀粘驰。
-
__bridge_retained
,轉(zhuǎn)換后自動調(diào)用CFRetain,適用于Foudation對象轉(zhuǎn)換為Core Foundation對象屡谐,同時將對象(內(nèi)存)的管理權(quán)交給我們述么,后續(xù)需要使用CFRelease或者相關(guān)方法來釋放對象。 -
__bridge_transfer
:轉(zhuǎn)換后自動調(diào)用CFRelease,同時將對象(內(nèi)存)的管理權(quán)交給ARC愕掏。適用于Core Foundation對象轉(zhuǎn)換為Foundation對象度秘。
由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之間饵撑,我們需要使用到__bridge,__bridge_retained和__bridge_transfer三個轉(zhuǎn)換關(guān)鍵字剑梳。