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

主要涉及以下三種用法:

  • __bridge
  • __bridge_retained
  • __bridge_transfer

__bridge

- (void)test
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
    
    CFURLRef ref = (__bridge CFURLRef)url; // No CFRetain, No CFRelease
    
    // url released
}

__bridge_retained

將 OC 對象轉化為 CF 對象時,將 OC 對象的所有權交給 CF 對象,相當于 CFBridgingRetain()

泄露:

- (void)test2
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
    
    CFURLRef ref = (__bridge_retained CFURLRef)url; // ref CFRetained
    
    // url released
}

不泄露:

- (void)test2
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.baidu.com"]; // url retained
    
    CFURLRef ref = (__bridge_retained CFURLRef)url; // ref CFRetained
    CFRelease(ref); // ref CFReleased;如果這里不 CFRelease,就會有內存泄露
    
    // url released
}

__bridge_transfer

將 CF 對象轉化為 OC 對象時,將 CF 對象的所有權交給 OC 對象,相當于 CFBridgingRelease()

泄露:

- (void)test3
{
    CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
}

不泄露:

- (void)test3
{
    CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
    
    CFRelease(cfString); // cfString CFReleased
}

不泄露:

- (void)test3
{
    CFStringRef cfString = CFStringCreateWithFormat(NULL, NULL, CFSTR("Hello, world!")); // cfString alloced
    
//    CFRelease(cfString); // cfString CFReleased
    NSString *osString = (__bridge_transfer NSString *)cfString; // cfString CFReleased, osString retained
    
    // osString released
}

總結

  • 每一個 CFRetain 都需要一個 CFRelease 對應;
  • 每一個 CFCreate 都需要一個 CFRelease 對應;
  • __bridge_retained 等價于 CFRetain;
  • __bridge_transfer 等價于 CFRelease;
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容