core foundation与objective-c之间有什么关系和区别?
走同样的路,发现不同的人生
Core Foundation框架 (CoreFoundation.framework) 是一組C語言接口,它們為iOS應用程式提供基本資料管理和服務功能。以下列舉該框架支援進行管理的資料以及可提供的服務:
群體資料型態 (數組、集合等)
程式包
字串管理
日期和時間管理
原始資料塊管理
偏好管理
URL及資料流操作
線程和RunLoop
埠和soket通訊
Core Foundation框架和Foundation框架緊密相關,它們為相同功能提供接口,但Foundation框架提供Objective-C接口。如果您將Foundation物件和Core Foundation類型摻雜使用,則可利用兩個框架之間的 “toll-free bridging”。所謂的Toll-free bridging是說您可以在某個框架的方法或函數同時使用Core Foundatio和Foundation 框架中的某些類型。很多資料類型支援這項特性,其中包括群體和字串資料類型。每個框架的類別和類型描述都會對某個物件是否為 toll-free bridged,應和什麼物件橋接進行說明。
Objective-C指標與CoreFoundation指標之間的轉換
ARC僅管理Objective-C指針(retain、release、autorelease),不管理CoreFoundation指針,CF指針由人工管理,手動的CFRetain和CFRelease來管理,註,CF中沒有autorelease。
CocoaFoundation指標與CoreFoundation指標轉換,需要考慮的是所指向物件所有權的歸屬。 ARC提供了3個修飾符來管理。
1. __bridge,什麼也不做,只是轉換。此種情況下:
i). 從Cocoa轉換到Core,需要人工CFRetain,否則,Cocoa指針釋放後, 傳出去的指針則無效。
ii). 從Core轉換到Cocoa,需要人工CFRelease,否則,Cocoa指針釋放後,對象引用計數仍為1,不會被銷毀。
2. __bridge_retained,轉換後自動呼叫CFRetain,即幫助自動解決上述i的情形。
3. __bridge_transfer,轉換後自動呼叫CFRelease,即幫助自動解決上述ii的情形。
由於ARC無法管理Core Foundation Object的生命週期,所以在Core Foundation和ARC之間,我們需要使用到__bridge,__bridge_retained和__bridge_transfer三個轉換關鍵字。
根據蘋果官方的文件(https://developer.apple.com/library/i...):
__bridge只做型別轉換,但不修改物件(記憶體)管理權;
__bridge_retained(也可以使用CFBridgingRetain)將Objective-C的物件轉換為Core Foundation的對象,同時將物件(記憶體)的管理權交給我們,後續需要使用CFRelease或相關方法來釋放物件;
__bridge_transfer(也可以使用CFBridgingRelease)將Core Foundation的物件轉換為Objective-C的對象,同時將物件(記憶體)的管理權交給ARC。
Core Foundation框架 (CoreFoundation.framework) 是一組C語言接口,它們為iOS應用程式提供基本資料管理和服務功能。以下列舉該框架支援進行管理的資料以及可提供的服務:
群體資料型態 (數組、集合等)
程式包
字串管理
日期和時間管理
原始資料塊管理
偏好管理
URL及資料流操作
線程和RunLoop
埠和soket通訊
Core Foundation框架和Foundation框架緊密相關,它們為相同功能提供接口,但Foundation框架提供Objective-C接口。如果您將Foundation物件和Core Foundation類型摻雜使用,則可利用兩個框架之間的 “toll-free bridging”。所謂的Toll-free bridging是說您可以在某個框架的方法或函數同時使用Core Foundatio和Foundation 框架中的某些類型。很多資料類型支援這項特性,其中包括群體和字串資料類型。每個框架的類別和類型描述都會對某個物件是否為 toll-free bridged,應和什麼物件橋接進行說明。
Objective-C指標與CoreFoundation指標之間的轉換
ARC僅管理Objective-C指針(retain、release、autorelease),不管理CoreFoundation指針,CF指針由人工管理,手動的CFRetain和CFRelease來管理,註,CF中沒有autorelease。
CocoaFoundation指標與CoreFoundation指標轉換,需要考慮的是所指向物件所有權的歸屬。 ARC提供了3個修飾符來管理。
1. __bridge,什麼也不做,只是轉換。此種情況下:
i). 從Cocoa轉換到Core,需要人工CFRetain,否則,Cocoa指針釋放後, 傳出去的指針則無效。
ii). 從Core轉換到Cocoa,需要人工CFRelease,否則,Cocoa指針釋放後,對象引用計數仍為1,不會被銷毀。
2. __bridge_retained,轉換後自動呼叫CFRetain,即幫助自動解決上述i的情形。
3. __bridge_transfer,轉換後自動呼叫CFRelease,即幫助自動解決上述ii的情形。
由於ARC無法管理Core Foundation Object的生命週期,所以在Core Foundation和ARC之間,我們需要使用到__bridge,__bridge_retained和__bridge_transfer三個轉換關鍵字。
根據蘋果官方的文件(https://developer.apple.com/library/i...):
__bridge只做型別轉換,但不修改物件(記憶體)管理權;
__bridge_retained(也可以使用CFBridgingRetain)將Objective-C的物件轉換為Core Foundation的對象,同時將物件(記憶體)的管理權交給我們,後續需要使用CFRelease或相關方法來釋放物件;
__bridge_transfer(也可以使用CFBridgingRelease)將Core Foundation的物件轉換為Objective-C的對象,同時將物件(記憶體)的管理權交給ARC。