題目你也可以理解為 Core Foundation 和 Objective-C 之間的關(guān)系驰怎。
1)歷史概要
先來說說「Core Foundation」(以下簡稱CF)的歷史吧。
當(dāng)年喬布斯被自己創(chuàng)辦的公司驅(qū)逐后赌躺,成立了「NeXT Computer」,其實(shí)做的還是老本行:賣電腦拒课,但依舊不景氣徐勃。好在NeXTSTEP系統(tǒng)表現(xiàn)還不錯(cuò),虧損不至于太嚴(yán)重早像。正好此時(shí)蘋果的市場份額大跌僻肖,急需一個(gè)新的操作系統(tǒng),結(jié)果大家都知道了卢鹦,喬布斯借此收購臀脏,重新回到了蘋果。
這里就牽扯到了一個(gè)問題冀自,如何讓舊有的系統(tǒng)(Mac OS 9)和NeXTSTEP合成為一個(gè)新系統(tǒng)揉稚?這就需要一個(gè)更為底層的核心庫可以供Mac Toolbox和OPENSTEP雙方調(diào)用。CF就這么誕生了熬粗。
CF是由C語言實(shí)現(xiàn)的搀玖,而不是Objective-C,所以如果用到了CF驻呐,就需要手動(dòng)管理內(nèi)存灌诅,ARC是無能為力的。當(dāng)然因?yàn)镃F和Foundation之間的友好關(guān)系含末,它們之間的管理權(quán)也是可以移交的延塑,這個(gè)后面再說。
CF提供了基礎(chǔ)功能答渔,如CFString,CFDate,CFNumber等等,以CFString為例侥涵,CFString和NSString之間是什么關(guān)系沼撕?NSString其實(shí)是一個(gè)「類簇」宋雏,也就是抽象接口,所以String Objects并不是NSString實(shí)例务豺,而是實(shí)現(xiàn)了NSString方法的私有類的實(shí)例磨总,也就是CFString。
NSLog(NSStringFromClass([@"Some Class" class]));
# output __NSCFConstantString
同時(shí)NSStrings和CFStrings之間可以自由轉(zhuǎn)換笼沥,也就是
「toll free bridging」蚪燕。比如:
CFStringRef aCFString = (CFStringRef)aNSString;
NSString *aNSString = (NSString *)aCFString;
2)__bridge
? ? 因?yàn)榫幾g器無法自動(dòng)管理CF的內(nèi)存,所以CF對(duì)象在使用完后奔浅,需要手動(dòng)釋放(CFRelease)馆纳。如果使用ARC來管理內(nèi)存,蘋果提供了3種方法來處理
__bridge只是在CF和OC之間傳遞指針汹桦,其他的事啥也沒干鲁驶,所以轉(zhuǎn)換成CF時(shí),還是要手動(dòng)釋放內(nèi)存舞骆。
CFStringRef aCFString = CFStringCreateWithCString(NULL, "test", kCFStringEncodingASCII);
NSString *aNSString = (__bridge NSString *)aCFString;
(void)aNSString;
CFRelease(aCFString);
3)__bridge_retained
__bridge_retained或者CFBridgingRetain()钥弯,將Objective-C對(duì)象轉(zhuǎn)換為Core Foundation對(duì)象,把對(duì)象所有權(quán)橋接給Core Foundation對(duì)象督禽,同時(shí)剝奪ARC的管理權(quán)脆霎,后續(xù)需要開發(fā)者使用CFRelease或者相關(guān)方法手動(dòng)來釋放對(duì)象。
4)__bridge_transfer
__bridge_transfer 或者 CFBridgingRelease() 將非Objective-C對(duì)象轉(zhuǎn)換為Objective-C對(duì)象狈惫,同時(shí)將對(duì)象的管理權(quán)交給ARC睛蛛,開發(fā)者無需手動(dòng)管理內(nèi)存。
最后虱岂,因?yàn)镃F是用C實(shí)現(xiàn)的玖院,且處于下層,所以執(zhí)行速度上會(huì)比Foundation稍微快一點(diǎn)第岖,不過也就是一點(diǎn)點(diǎn)难菌,幾乎察覺不到。相比Foundation帶來的ARC內(nèi)存管理和更多的API蔑滓,開發(fā)上的效率會(huì)大幅提升郊酒,所以還是盡量多的使用OC。
5)總結(jié):
Core Foundation(CF)實(shí)現(xiàn)的是C接口键袱, Cocoa Foundation實(shí)現(xiàn)的是Obj-C接口
因?yàn)锳RC是用Obj-C實(shí)現(xiàn)的燎窘,所以ARC只能管理Foundation對(duì)象,無法管理CF對(duì)象
但是OC和CF是可以相互轉(zhuǎn)化的