Foundation對(duì)象是Objective-C對(duì)象,使用Objective-C語(yǔ)言實(shí)現(xiàn);而Core Foundation對(duì)象是C對(duì)象,使用C語(yǔ)言實(shí)現(xiàn)。兩者之間可以通過__bridge、__bridge_transfer、__bridge_retained等關(guān)鍵字轉(zhuǎn)換(橋接)。
Foundation對(duì)象和Core Foundation對(duì)象更重要的區(qū)別是ARC下的內(nèi)存管理問題。在非ARC下兩者都需要開發(fā)者手動(dòng)管理內(nèi)存,沒有區(qū)別。但在ARC下,系統(tǒng)只會(huì)自動(dòng)管理Foundation對(duì)象的釋放,而不支持對(duì)Core Foundation對(duì)象的管理。因此,在ARC下兩者進(jìn)行轉(zhuǎn)換后,必須要確定轉(zhuǎn)換后的對(duì)象是由開發(fā)者手動(dòng)管理,還是由ARC系統(tǒng)繼續(xù)管理,否則可能導(dǎo)致內(nèi)存泄漏問題。
下面以NSString對(duì)象(Foundation對(duì)象)和CFStringRef對(duì)象(Core Foundation對(duì)象)為例,介紹兩者的轉(zhuǎn)換和內(nèi)存管理權(quán)移交問題。
1)在非ARC下,NSString對(duì)象和CFStringRef對(duì)象可以直接進(jìn)行強(qiáng)制轉(zhuǎn)換,都是手動(dòng)管理內(nèi)存,無(wú)須關(guān)心內(nèi)存管理權(quán)的移交問題。
2)在ARC下,NSString對(duì)象和CFStringRef對(duì)象在相互轉(zhuǎn)換時(shí),需要選擇使用__bridge、__bridge_transfer和__bridge_retained來(lái)確定對(duì)象的管理權(quán)轉(zhuǎn)移問題,三者的作用語(yǔ)義分別如下:
①__bridge關(guān)鍵詞最常用,它的含義是不改變對(duì)象的管理權(quán)所有者,本來(lái)由ARC管理的Foundation對(duì)象,轉(zhuǎn)換成Core Foundation對(duì)象后依然由ARC管理;本來(lái)由開發(fā)者手動(dòng)管理的Core Foundation對(duì)象轉(zhuǎn)換成Foundation對(duì)象后繼續(xù)由開發(fā)者手動(dòng)管理。示例代碼如下:

②__bridge_transfer用在將Core Foundation對(duì)象轉(zhuǎn)換成Foundation對(duì)象時(shí),用于進(jìn)行內(nèi)存管理權(quán)的移交,即本來(lái)需由開發(fā)者手動(dòng)管理釋放的Core Foundation對(duì)象在轉(zhuǎn)換成Foundation對(duì)象后,交由ARC來(lái)管理對(duì)象的釋放,開發(fā)者不用再關(guān)心對(duì)象的釋放問題,因?yàn)椴粫?huì)發(fā)生內(nèi)存泄漏。示例代碼如下:

③__bridge_retained用在將Foundation對(duì)象轉(zhuǎn)換成Core Foundation對(duì)象時(shí),進(jìn)行ARC內(nèi)存管理權(quán)的剝奪,即本來(lái)由ARC管理的Foundation對(duì)象在轉(zhuǎn)換成Core Foundation對(duì)象后,ARC不再繼續(xù)管理該對(duì)象,需要開發(fā)者自己進(jìn)行手動(dòng)釋放該對(duì)象,否則會(huì)發(fā)生內(nèi)存泄漏。示例代碼如下:
