当前位置: 首页 > 工具软件 > Foundation > 使用案例 >

对Core Foundation 与 Cocoa Foundation的理解

曹高轩
2023-12-01

Cocoa Foundation 

苹果的官方文档:Cocoa Foundation


Foundation框架定义的是OC类的基础层,它的根是NSObject类,(和NSObjectNSCopying协议一起)定义了基本的对象属性和行为。除了提供一组有用的基本对象类之外,它还引入了一些OC语言不涵盖的功能的范例。Foundation预期实现以下几个功能:

  • 提供少量的基本的实用工具类;
  • 为了降低开发的难度,引入了一些统一的约定,比如dealloc函数;
  • 支持Unicode字符串、对象持久性和对象分布;
  • 提供了一个标准的操作系统独立,提高可移植性。

Foundation包括对象类、表示基本数据类型(例如字符串和字节数组)的类、用于存储其他对象的集合类、表示日期等系统信息的类以及表示通信端口的类。Foundation引入了几个范例,以避免在常见情况下的混乱,并在类层次结构中引入一定程度的一致性。这种一致性是通过一些标准策略完成的,例如对象所有权(即,谁负责处理对象)以及抽象类(如NSEnumerator)。这些新的范例减少了API中特殊和异常情况的数量,并允许您通过重复使用与各种对象相同的机制来更有效地编码。


Core Foundation


苹果的官方文档:Core Foundation


Core Foundation是一个具有一组编程接口的库或者框架,概念上源于基于Objective-C的Foundation框架,但是以C语言实现。为此,Core Foundation在C中实现了有限的对象模型。Core Foundation定义了封装数据和函数的不透明类型,以下称为“对象”。Core Foundation对象的编程接口设计为易于使用和重用,起到的作用为:

  • 支持在各种框架和库之间共享代码和数据
  • 使一定程度的操作系统独立成为可能
  • 支持Unicode字符串的国际化
  • 提供常见的API和其他有用的功能,包括插件架构,XML属性列表和首选项

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。





 类似资料: