Toll-free bridging

字面意思是“免費(fèi)橋接技術(shù)”,橋接的是Core Foundation框架和 Foundation框架之間的數(shù)據(jù)。

通過(guò)這種技術(shù),可以將Core Foundation中的類,比如 CFLocale,轉(zhuǎn)化為對(duì)應(yīng)的Foundation中的類 NSLocale 來(lái)使用。

語(yǔ)法和強(qiáng)制類型轉(zhuǎn)換一樣,如下,是將 NSLocale類型轉(zhuǎn)換成 CFLocalRef類型

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;

內(nèi)存管理的問(wèn)題

在ARC的情況下,F(xiàn)oundation類的內(nèi)存是自動(dòng)管理的。
Core Foundation中的類需要手動(dòng)管理。
在數(shù)據(jù)類型轉(zhuǎn)換后,涉及到內(nèi)存管理的問(wèn)題,在以下幾種修飾符下,分別有不同的處理。

修飾符有三種
__bridge
__bridge_retained
__bridge_transfer

逐一來(lái)說(shuō)

__bridge

如果用__bridge來(lái)修飾的,只是將指針類型轉(zhuǎn)移了,其內(nèi)存管理的所有權(quán)不變。也就是說(shuō),創(chuàng)建時(shí)的類是ARC管理內(nèi)存,轉(zhuǎn)換后仍然是。創(chuàng)建時(shí)的類是Core Foundation類,需要手動(dòng)管理內(nèi)存,轉(zhuǎn)換后仍然是。

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge CFLocaleRef)gbNSLocale;
// 這里的gbCFLocale不需要手動(dòng)管理內(nèi)存

CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (__bridge NSLocale *)CFBridgingRelease(myCFLocale);
// 這里的mhNSLocale需要手動(dòng)管理內(nèi)存

__bridge_retained

在將object-c的指針轉(zhuǎn)化為Core Foundation的指針時(shí),用__bridge_retained修飾符,意味著自己要去管理內(nèi)存。

NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
CFLocaleRef gbCFLocale = (__bridge_retained CFLocaleRef)gbNSLocale;
// 這里的gbCFLocale需要自己手動(dòng)管理內(nèi)存

而將Core Foundation指針轉(zhuǎn)換為Object-c 不用這個(gè)修飾符

__bridge_transfer

這個(gè)修飾符和__bridge_retained有相反的作用,再將非Object-c的指針轉(zhuǎn)化為Object-c的指針時(shí),是用此修飾符,會(huì)把此對(duì)象的內(nèi)存管理權(quán)限交給ARC去處理。這樣,我們就不用再去自己管理該對(duì)象的內(nèi)存問(wèn)題了。

CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
NSLocale *myNSLocale = (__bridge_transfer NSLocale *)CFBridgingRelease(myCFLocale);
// myNSLocale的內(nèi)存會(huì)被系統(tǒng)自動(dòng)管理,不需要再手動(dòng)管理內(nèi)寸。
?著作權(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)容

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