首先需要說明的是:ARC 環境下編譯器不會自動管理 CF 對象的內存,所以當創建一個 CF 對象時,使用結束后要用 CFRelease 函數將其手動釋放,CF 對象和 OC 對象相互轉化的時候該如何管理內存,有如下三個關鍵字:
- __bridge:CF對象和 OC 對象轉化時只涉及對象類型,不涉及對象和所有權的轉化。其本身的意思是:ARC 仍然具備這個 OC 對象的所有權
NSURL * url = [[NSURL alloc] initWithString:@"www.baidu.com"];
CFURLRef ref = (__bridge CFURLRef)url;
__bridge_transfer:常用在 CF 對象裝換成 OC 對象時,將 CF 對象的所有權交給 OC 對象,此時 ARC 就可以自動管理內存;作用和 CFBridgingRelease()相同
__bridge_retained:(與_bridge_transfer相反)常用在 OC 對象轉換成 CF 對象,將 OC 對象的所有權交給 CF 對象來管理,作用同(CFBridgingRetain()),意味著 ARC 將交出對象的所有權。
NSURL * url = [NSURL URLWithString:@"www.baidu.com"];
CFURLRef ref = (__bridge_retained CFURLRef)url;
CFRelease(ref);
參考文章:http://www.cnblogs.com/zzltjnh/p/3885012.html
(愛笑的雷小豆)的博客