Cocoa Foundation
苹果的官方文档:Cocoa Foundation
Foundation框架定义的是OC类的基础层,它的根是NSObject类,(和NSObject及NSCopying协议一起)定义了基本的对象属性和行为。除了提供一组有用的基本对象类之外,它还引入了一些OC语言不涵盖的功能的范例。Foundation预期实现以下几个功能:
Foundation包括对象类、表示基本数据类型(例如字符串和字节数组)的类、用于存储其他对象的集合类、表示日期等系统信息的类以及表示通信端口的类。Foundation引入了几个范例,以避免在常见情况下的混乱,并在类层次结构中引入一定程度的一致性。这种一致性是通过一些标准策略完成的,例如对象所有权(即,谁负责处理对象)以及抽象类(如NSEnumerator)。这些新的范例减少了API中特殊和异常情况的数量,并允许您通过重复使用与各种对象相同的机制来更有效地编码。
Core Foundation
苹果的官方文档:Core Foundation
Core Foundation是一个具有一组编程接口的库或者框架,概念上源于基于Objective-C的Foundation框架,但是以C语言实现。为此,Core Foundation在C中实现了有限的对象模型。Core Foundation定义了封装数据和函数的不透明类型,以下称为“对象”。Core Foundation对象的编程接口设计为易于使用和重用,起到的作用为:
Core Foundation使OS X上的不同框架和库可以共享代码和数据。应用程序,库和框架可以定义在其外部接口中并入Core Foundation类型的C例程;因此它们可以通过这些接口将数据(作为Core Foundation对象)传递给彼此。
Core Foundation 还提供指定服务与Core Foundation之间的““toll-free bridging”(可译为:免费桥接)。免费桥接使您可以将Cocoa对象替换为Core Foundation对象的函数参数,反之亦然。一些Core Foundation的类型和功能是在不同操作系统上具有相同的映射。因此使用这些API的代码更容易移植到不同的平台上。日期和数字类型抽象时间工具,并提供在绝对和公历时间之间进行转换的设施。它还抽象数值,并提供了在这些值的不同内部表示之间进行转换的工具。
Core Foundation为应用程序开发带来的主要优点之一是国际化支持。通过其String对象,Core Foundation可以在所有OS X和Cocoa编程接口和实现之间实现轻松,强大和一致的国际化。此支持的基本部分是CFString类型,其实例表示16位Unicode字符数组。 CFString对象具有足够的灵活性,可以容纳数兆字节的字符,而且简单而低级,足以用于传送字符数据的所有编程接口。它的性能与标准C字符串的性能没有太大的不同。
需要注意的是:
Core Foundation框架的函数是基于C语言的封装,在现行的ARC是不能自动管理这些(以CF开头的框架)引用计数的,因此,在实际开发中如果有使用到Core Foundation框架的对象,需要我们手动来管理内存,例如下边代码:使用了一个CFRelease函数来手动释放创建的观察者(defaultModelObserver)
//用Core Foundation注册一个Runloop的观察者
-(void)addRunloopObserver{
//获取当前RunLoop
CFRunLoopRef runloop = CFRunLoopGetCurrent();
//定义一个上下文
CFRunLoopObserverContext context = {
0,
(__bridge void *)(self),
&CFRetain,
&CFRelease,
NULL,
};
//定义一个观察者
static CFRunLoopObserverRef defaultModeObserver;
//创建观察者
defaultModeObserver = CFRunLoopObserverCreate(NULL, kCFRunLoopBeforeWaiting, YES, NSIntegerMax - 999, &Callback, &context);
//添加当前RunLoop的观察者
CFRunLoopAddObserver(runloop, defaultModeObserver, kCFRunLoopDefaultMode);
//C语言里面有Creat\new\copy 就需要 释放 ARC 管不了!!
CFRelease(defaultModeObserver);
}
除了以CF开头的,凡是带有Ref结尾的对象,都是基于Core Foundation的封装,也可以说是基于C语言的封装,比如获取通讯录的对象:ABAddressBookRef、CGContextRef。