ARC下OC對象和CF對象之間的橋接(bridge)

在開發iOS應用程序時咱們有時會用到Core Foundation對象簡稱CF,例如Core Graphics、Core Text,而且咱們可能須要將CF對象和OC對象進行互相轉化,咱們知道,ARC環境下編譯器不會自動管理CF對象的內存,因此當咱們建立了一個CF對象之後就須要咱們使用CFRelease將其手動釋放,那麼CF和OC相互轉化的時候該如何管理內存呢?答案就是咱們在須要時可使用__bridge,__bridge_transfer,__bridge_retained,具體介紹和用法以下url

1.__bridge:CF和OC對象轉化時只涉及對象類型不涉及對象全部權的轉化;spa

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (CFURLRef)url;

上面的這段代碼在ARC環境下系統會給出錯誤提示和錯誤修正,修正後以下:code

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;

系統爲咱們自動添加了__bridge,由於是OC建立的對象而且在轉換時沒有涉及對象全部權的轉換,因此上面的代碼不須要加CFReleaseorm

2.__bridge_transfer:經常使用在講CF對象轉換成OC對象時,將CF對象的全部權交給OC對象,此時ARC就能自動管理該內存;(做用同CFBridgingRelease())對象

 

3.__bridge_retained:(與__bridge_transfer相反)經常使用在將OC對象轉換成CF對象時,將OC對象的全部權交給CF對象來管理;(做用同CFBridgingRetain())內存

NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);

當使用_bridge_retained標識符之後,表明OC要將對象全部權交給CF對象本身來管理,因此咱們要在ref使用完成之後用CFRelease將其手動釋放.

複製代碼

CFStringRef cfString= CFURLCreateStringByAddingPercentEscapes(
                                                                  NULL,
                                                                  (__bridge CFStringRef)text,
                                                                  NULL,
                                                                  CFSTR("!*’();:@&=+$,/?%#[]"), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
NSString *ocString = (__bridge_transfer CFStringRef)cfString;

複製代碼

此時OC即得到了對象的全部權,ARC負責自動釋放該對象,若是咱們在結尾加上CFRelease(cfString)純屬多此一舉,雖不會崩潰,可是控制檯會打印出該對象被free了兩次。開發

以上就是本文的所有內容,用法很簡單也很好理解,但願能給你們帶來幫助。編譯器

相關文章
相關標籤/搜索