__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也被釋放。