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,具體介紹和用法如下

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

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

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

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

系統爲我們自動添加了__bridge,因爲是OC創建的對象並且在轉換時沒有涉及對象所有權的轉換,所以上面的代碼不需要加CFRelease

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了兩次。

以上就是本文的全部內容,用法很簡單也很好理解,希望能給大家帶來幫助。

轉自:http://www.cnblogs.com/zzltjnh/p/3885012.html

發佈了0 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章