__bridge,__bridge_transfer和__bridge_retained

__bridge是oc對(duì)象和CF對(duì)象之間的相互轉(zhuǎn)換,但是不涉及對(duì)象所有權(quán)的轉(zhuǎn)換
__bridge_transfer是cf對(duì)象轉(zhuǎn)為oc對(duì)象,將cf對(duì)象的所有權(quán)轉(zhuǎn)給oc對(duì)象,此時(shí)ARC自動(dòng)管理內(nèi)存,作用同CFBridgingRelease()
__bridge_retained是OC對(duì)象轉(zhuǎn)為CF對(duì)象,將OC對(duì)象的所有權(quán)轉(zhuǎn)給CF對(duì)象,即OC對(duì)象轉(zhuǎn)化成CF對(duì)象時(shí),涉及到對(duì)象類(lèi)型和對(duì)象所有權(quán)的轉(zhuǎn)化,作用同CFBridgingRetain()

0x01 什么是對(duì)象間的橋接
Core Foundation 是一組C語(yǔ)言接口,它與Foundation功能相同,只是Foundation框架提供的是Objective-C接口。

Core Foundation中的對(duì)象也有類(lèi)似引用計(jì)數(shù)的概念,其對(duì)應(yīng)的接口是CFRetain/CFRelease;

這兩個(gè)框架的對(duì)象之間可以相互轉(zhuǎn)換,當(dāng)使用ARC時(shí),Core Foundation中的對(duì)象不被ARC所管理。

所以Core Foundation和Foundation中的對(duì)象在相互轉(zhuǎn)換的過(guò)程中會(huì)涉及到對(duì)象所有權(quán)的轉(zhuǎn)換,這里便用到了bridge修飾符

__bridge關(guān)鍵字修飾的類(lèi)型轉(zhuǎn)換只把OC對(duì)象的指針傳遞給CF對(duì)象,但不傳遞它的所有權(quán):

NSString *theString = @"Learn Objective-C";
cfString = (__bridge CFStringRef)theString;
 
// cfString gets the assignment, but ownership stays with theString.

當(dāng)cfString被ARC release后,theString指針仍然指向一個(gè)有效的對(duì)象。
__bridge_retained
將OC對(duì)象轉(zhuǎn)化為CF對(duì)象時(shí),所有權(quán)歸CF對(duì)象,相當(dāng)于 CFBridgingRetain():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_retained CFStringRef)theString
 
//In this case, cfString string owns the pointer and its retain count is incremented.
//You’re responsible for managing it with retain/release.

使用__bridge_retained進(jìn)行轉(zhuǎn)換后,cfString便擁有了theString對(duì)象的所有權(quán)。

這時(shí)如果theString被ARC release,cfString仍然有效。

然而又因?yàn)镃ore Foundation中的對(duì)象也存在引用計(jì)數(shù)概念,所以需要使用CFRelease()手動(dòng)對(duì)cfString進(jìn)行release操作。

__bridge_transfer
這是與__bridge_retained相反的關(guān)鍵字聲明。

__bridge_transfer將CF對(duì)象轉(zhuǎn)化為OC對(duì)象時(shí),所有權(quán)歸OC對(duì)象,相當(dāng)于CFbridgingRelease():

NSString *theString = @"Learn Objective-C";
cfString = (__bridge_transfer CFStringRef)theString;
 
//In this case, ARC owns the object and will ensure it’s released like any other ARC object.

使用__bridge_transfer進(jìn)行轉(zhuǎn)換后,ARC會(huì)確保theString被釋放的同時(shí),cfString也被釋放。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開(kāi)了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽(tīng)閱讀 10,817評(píng)論 0 11
  • 彩排完,天已黑
    劉凱書(shū)法閱讀 4,468評(píng)論 1 3
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒。表情可以傳達(dá)很多信息。高興了當(dāng)然就笑了,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 129,555評(píng)論 2 7

友情鏈接更多精彩內(nèi)容