在開發(fā)iOS應(yīng)用程序時我們有時會用到Core Foundation對象簡稱CF,例如Core Graphics、Core Text,并且我們可能需要將CF對象和OC對象進(jìn)行互相轉(zhuǎn)化,我們知道,ARC環(huán)境下編譯器不會自動管理CF對象的內(nèi)存,所以當(dāng)我們創(chuàng)建了一個CF對象以后就需要我們使用CFRelease將其手動釋放,那么CF和OC相互轉(zhuǎn)化的時候該如何管理內(nèi)存呢?答案就是我們在需要時可以使用__bridge,__bridge_transfer,__bridge_retained,具體介紹和用法如下
1.__bridge:CF和OC對象轉(zhuǎn)化時只涉及對象類型不涉及對象所有權(quán)的轉(zhuǎn)化;
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];CFURLRef ref = (CFURLRef)url;上面的這段代碼在ARC環(huán)境下系統(tǒng)會給出錯誤提示和錯誤修正,修正后如下:
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];CFURLRef ref = (__bridge CFURLRef)url;系統(tǒng)為我們自動添加了__bridge,因?yàn)槭荗C創(chuàng)建的對象并且在轉(zhuǎn)換時沒有涉及對象所有權(quán)的轉(zhuǎn)換,所以上面的代碼不需要加CFRelease
2.__bridge_transfer:常用在講CF對象轉(zhuǎn)換成OC對象時,將CF對象的所有權(quán)交給OC對象,此時ARC就能自動管理該內(nèi)存;(作用同CFBridgingRelease())
3.__bridge_retained:(與__bridge_transfer相反)常用在將OC對象轉(zhuǎn)換成CF對象時,將OC對象的所有權(quán)交給CF對象來管理;(作用同CFBridgingRetain())
NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];CFURLRef ref = (__bridge_retained CFURLRef)url;CFRelease(ref);當(dāng)使用_bridge_retained標(biāo)識符以后,代表OC要將對象所有權(quán)交給CF對象自己來管理,所以我們要在ref使用完成以后用CFRelease將其手動釋放.CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes( NULL, (__bridge CFStringRef)text, NULL, CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringE ncodingToEncoding(NSUTF8StringEncoding));NSString *ocString = (__bridge_transfer CFStringRef)cfString; 此時OC即獲得了對象的所有權(quán),ARC負(fù)責(zé)自動釋放該對象,如果我們在結(jié)尾加上CFRelease(cfString)純屬畫蛇添足,雖不會崩潰,但是控制臺會打印出該對象被free了兩次。
新聞熱點(diǎn)
疑難解答