美文网首页
Objective-C 对象与 Core Foundation

Objective-C 对象与 Core Foundation

作者: spbreak | 来源:发表于2016-02-19 16:06 被阅读166次
    Toll-Free Bridge

    转换函数

    CFTypeRef CFBridgingRetain(id x) {
        return (__bridge_retained CFTypeRef)x;
    }

    id CFBridgingRelease(CFTypeRef x) {
        return (__bridge_transfer id)x;
    }

    例:

    CFMutableArrayRef cfObject = NULL;
    {
        id obj = [[NSMutableArray alloc] init];
        cfObject = CFBridgingRetain(obj);
        CFShow(cfObject);
        printf("retain count = %d\n", CFGetRetainCount(cfObject));
    }
    printf("retain count after the scope = %d\n", CFGetRetainCount(cfObject));
    CFRelease(cfObject);

    输出结果

    (
    )
    retain count = 2
    retain count after the scope = 1

    由此可知, Foundation 框架的 API 生成并持有的 Objective-C 对象能够作为 Core Foundation 对象来使用. 也可以通过 CFRelease 来释放. 当然, 也可以使用 __bridge_retained 转换来替代 CFBridgingRetain.

    CFMutableArrayRef cfObject = (__bridge_retained CFMutableArrayRef)obj;

    使用 __bridge 转换来替代 CFBridgingRetain 或 __bridge_retained 转换时, 源代码会变成什么样呢?

    __bridge 转换不改变对象的持有状况, 所以将产生悬垂指针

    以下为用 __bridge 转换替代 CFBridgingRelease 或 __bridge_transfer 转换的情形

    内存泄漏

    相关文章

      网友评论

          本文标题:Objective-C 对象与 Core Foundation

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