搜尋

首頁  >  問答  >  主體

cocoa-touch - core foundation与objective-c区别?

core foundation与objective-c之间有什么关系和区别?

怪我咯怪我咯2769 天前545

全部回覆(1)我來回復

  • PHPz

    PHPz2017-04-21 11:18:12

    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。

    回覆
    0
  • 取消回覆