字面意思是“免費(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)寸。