ARC下OC物件和CF物件之間的橋接(bridge)

weixin_34129145發表於2018-03-28

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

相關文章