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

Objective-C对象和Core Foundation对象的

作者: 南衍儿 | 来源:发表于2017-12-20 10:55 被阅读0次

    Core Foundation对象主要使用在用C语言编写的Core Foundation框架中,并使用引用计数。
    Core Foundation框架和Foundation框架紧密相关,它们为相同功能提供接口,但Foundation框架提供Objective-C接口。如果您将Foundation对象和Core Foundation类型掺杂使用,则可利用两个框架之间的 toll-free bridging。所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio和Foundation 框架中的某些类型。很多数据类型支持这一特性,其中包括群体和字符串数据类型。每个框架的类和类型描述都会对某个对象是否为toll-free bridged,应和什么对象桥接进行说明。

    ARC仅管理Objective-C指针(retainreleaseautorelease),不管理CoreFoundation指针,Core Foundation框架中的retian/release分别是CFRetian/CFRelease,使用CFGetRetainCount来获取retainCount。注,Core Foundation中没有autorelease
    例子:

    CFMutableArrayRef cfObject = NULL;
        {
            id obj = [[NSMutableArray alloc]init];
            cfObject = (__bridge_retained CFMutableArrayRef) 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
    

    Toll-free Bridging

    CocoaFoundation指针与CoreFoundation指针转换,需要考虑的是所指向对象所有权的归属。ARC提供了3个修饰符来管理。

    • __bridge:什么都不做,只是转换
      • 从Foundation转到Core Foundation,需要人工CFRetain,否则,Foundation指针释放后, 传出去的指针则无效。
      • 从Core Foundation转换到Foundation,需要人工CFRelease,否则,Foundation指针释放后,对象引用计数仍为1,不会被销毁。
    • __bridge_retained,转换后自动调用CFRetain,适用于Foudation对象转换为Core Foundation对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象。
    • __bridge_transfer:转换后自动调用CFRelease,同时将对象(内存)的管理权交给ARC。适用于Core Foundation对象转换为Foundation对象。

    由于ARC不能管理Core Foundation Object的生命周期,所以在Core Foundation和ARC之间,我们需要使用到__bridge,__bridge_retained和__bridge_transfer三个转换关键字。

    相关文章

      网友评论

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

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