介绍Core Foundation框架
Core Foundation
是使用C
实现的,它们为iOS应用程序提供基本数据管理和服务功能;
下面列举该框架支持进行管理的数据以及可提供的服务:
1、群体数据类型 (数组、集合等)
2、程序包
3、字符串管理
4、日期和时间管理
5、原始数据块管理
6、偏好管理
7、URL及数据流操作
8、线程和RunLoop
9、端口和soket通讯
特别注意的是:
针对内存管理问题,ARC
可以帮忙管理 Objective-C
对象, 但是不支持Core Foundation
对象的管理,所以转换后要注意一个问题:谁来释放使用后的对象。
二者之间联系
他们虽然属于不同的 Framework,但是具有相同的对象结构,所以可以用标准C的类型转换。
Foundation
对象和 Core Foundation
对象间的转换:俗称桥接 bridge
Core Foundation
框架和Foundation
框架紧密相关,它们为相同功能提供接口,但Foundation
框架提供Objective-C
接口。
如果您将Foundation
对象和Core Foundation
类型掺杂使用,则可利用两个框架之间的 “toll-free bridging”。
所谓的Toll-free bridging是说您可以在某个框架的方法或函数同时使用Core Foundatio
和Foundation
框架中的某些类型。
很多数据类型支持这一特性,其中包括群体和字符串数据类型。
每个框架的类和类型描述都会对某个对象是否为 toll-free bridged,应和什么对象桥接进行说明。
如需进一步信息,请阅读Core Foundation
框架参考。
非ARC环境下的转换
本项目是ARC环境下的,创建一个非ARC的BridgeMRC
的NSObject
文件。
#import "BridgeMRC.h"
@implementation BridgeMRC
- (void)forExample{
NSString *aNNstring = @"hello world";
CFStringRef aCFString = (CFStringRef)aNNstring;
NSString *aString = (NSString *)aCFString;
NSLog(@"%@",aString);
[aNNstring release];
}
@end
我们在控制台看下结果:
我们会发现,真的只是单纯的转化,地址并没有变。
其实不测试也会是如此,毕竟没有new,只是转化而已。
最后不要忘记这是MRC环境下,要手动release
。
ARC环境下的转换
ARC的诞生大大简化了我们针对内存管理的开发工作,但是只支持管理 Objective-C
对象, 不支持 Core Foundation
对象。
Core Foundation
对象必须使用CFRetain
和CFRelease
来进行内存管理。
那么当使用Objective-C
和Core Foundation
对象相互转换的时候,必须让编译器知道,到底由谁来负责释放对象,是否交给ARC处理。只有正确的处理,才能避免内存泄漏和double free导致程序崩溃。
根据不同需求,有3种转换方式: __bridge (不改变对象所有权) __bridge_retained 或者 CFBridgingRetain() (解除 ARC 所有权) __bridge_transfer 或者 CFBridgingRelease() (给予 ARC 所有权&