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指针(retain
、release
、autorelease
),不管理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三个转换关键字。