美文网首页iOS知识收集
Objective-C ARC 下 OC 对象和 CF 对象之间

Objective-C ARC 下 OC 对象和 CF 对象之间

作者: 公爵海恩庭斯 | 来源:发表于2016-06-03 11:30 被阅读256次

主要涉及以下三种用法:

  • __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;

相关文章

网友评论

    本文标题:Objective-C ARC 下 OC 对象和 CF 对象之间

    本文链接:https://www.haomeiwen.com/subject/pkokdttx.html