美文网首页
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