什么是Objective-C直接橋接
? ? ? ? 蘋(píng)果公司為基于C語(yǔ)言的Core Foundation框架和基于Objective-C的Foundation框架中的許多數(shù)據(jù)類(lèi)型提供了互用性。這種功能稱(chēng)為直接橋接,通過(guò)它你可以在Core Foundation 函數(shù)調(diào)用和Objective-C消息的接受器中使用數(shù)據(jù)類(lèi)型相同的參數(shù)臂外。你可以通過(guò)將一種數(shù)據(jù)類(lèi)型轉(zhuǎn)換為另一種數(shù)據(jù)類(lèi)型陆淀,防止編譯器報(bào)警邀摆。常用的直接橋接數(shù)據(jù)類(lèi)型如下圖徘郭,其中包括Core Foundation數(shù)據(jù)類(lèi)型和對(duì)應(yīng)的Foundation框架數(shù)據(jù)類(lèi)型。
ARC下的橋接轉(zhuǎn)換
? ? ? 在使用ARC時(shí)好芭,通過(guò)ARC橋接轉(zhuǎn)換可以直接橋接數(shù)據(jù)類(lèi)型承疲。這些操作必須將特殊標(biāo)記__bridge,__bridge_retained,__bridge_transfer用作前綴邻耕。
__bridge
? ? ?使用__bridge標(biāo)記可以在不改變所有權(quán)的情況下,將對(duì)象從Core Foundation框架數(shù)據(jù)類(lèi)型轉(zhuǎn)換為Foundation框架數(shù)據(jù)類(lèi)型(反之亦然)燕鸽。換言之兄世,如果你以動(dòng)態(tài)方式創(chuàng)建了一個(gè)Foundation框架對(duì)象,然后(通過(guò)直接橋接)將它的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為Core Foundation框架數(shù)據(jù)類(lèi)型啊研,那么通過(guò)__bridge標(biāo)記可以使編譯器知道這個(gè)對(duì)象的生命周期仍舊由ARC管理御滩。反過(guò)來(lái),如果你創(chuàng)建了一個(gè)Core Foundation框架數(shù)據(jù)類(lèi)型的對(duì)象党远,然后將它的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為Foundation框架的數(shù)據(jù)類(lèi)型削解,那么通過(guò)__bridge標(biāo)記可以告訴編譯器這個(gè)對(duì)象的生命周期仍舊是以手動(dòng)方式管理的(不是ARC管理的)。注意沟娱,使用該標(biāo)記可以使編譯器不報(bào)錯(cuò)氛驮,但是不會(huì)改變對(duì)象的所有權(quán),因此使用它解決內(nèi)存泄漏和懸掛指針問(wèn)題時(shí)應(yīng)多加小心济似。
__bridge_retained
? ? ? 使用__bridge_retained標(biāo)記可以將Foundation框架數(shù)據(jù)類(lèi)型對(duì)象轉(zhuǎn)換為Core Foundation框架數(shù)據(jù)類(lèi)型對(duì)象矫废,并從ARC接管對(duì)象的所有權(quán)盏缤。這樣你就可以手動(dòng)管理直接橋接數(shù)據(jù)的生命周期。
__bridge_transfer
? ? ? ?使用__bridge_transfer標(biāo)記可以將Core Foundation框架數(shù)據(jù)類(lèi)型對(duì)象轉(zhuǎn)換為Foundation框架數(shù)據(jù)類(lèi)型對(duì)象磷脯,并且會(huì)將對(duì)象的所有權(quán)交給ARC管理蛾找。這樣就會(huì)由ARC管理對(duì)象的生命周期娩脾。
橋接轉(zhuǎn)換標(biāo)記的語(yǔ)法如下:
(橋接轉(zhuǎn)換標(biāo)記 目的數(shù)據(jù)類(lèi)型)變量名
下面是示例代碼:
? ? ? ? 第二個(gè)例子之所以使用__bridge_retained是因?yàn)槿绻苯佑胈_bridge會(huì)有潛在的懸掛指針問(wèn)題赵誓,因?yàn)樵趫?zhí)行橋接轉(zhuǎn)換時(shí),ARC會(huì)立刻向該NSString對(duì)象(存儲(chǔ)在greeting中)發(fā)送一條release消息柿赊。所以使用__bridge_retained俩功,避免ARC向該對(duì)象發(fā)送release消息,但是同時(shí)我們也必須手動(dòng)管理這個(gè)對(duì)象(已經(jīng)轉(zhuǎn)換為CFStringRef類(lèi)型)的生命周期碰声。
? ? ? ? 最后诡蜓,可以通過(guò)Xcode中Product菜單中的Analyze選項(xiàng)來(lái)對(duì)demo的內(nèi)存使用情況做簡(jiǎn)單檢查。