objective-c - CF 对象与 NS 对象

标签 objective-c ios

我试图理解为什么同时存在 CF 和 NS 对象,它们似乎做同样的事情并且可以通过免费桥接互换。比如说,如果 CFArray 和 NSArray 做同样的事情,并且我可以在它们之间自由转换,那么它们存在的意义何在?是否有关于何时使用其中一种的经验法则? CF 对象只是旧框架中的遗留对象吗?任何对此的见解将不胜感激。

最佳答案

按顺序回答您的问题:

  1. 他们俩存在的意义何在?有几个原因。

    如果你想提供一个 C API,比如 Carbon API,并且你需要数组和引用计数对象的字典,你需要一个像 Core Foundation 这样的库(它提供 CFArray) ,当然它需要有一个 C API。

    如果您想编写库供第三方在 Windows 上使用(例如),您需要提供 C API。

    如果您想编写一个低级库,例如用于与操作系统内核的接口(interface),并且您不想要 Objective-C 消息传递的开销,那么您需要一个 C API。

    因此,这些都是拥有 Core Foundation(一个纯 C 库)的充分理由。

    但是,如果您想在 Objective-C 中提供更高级别、更令人愉悦的 API,您需要表示数组、字典、引用计数对象等的 Objective-C 对象。所以你需要 Foundation,它是一个 Objective-C 库。

  2. 什么时候应该使用其中一种?通常,您应该尽可能使用 Objective-C 类(例如 NSArray),因为 Objective-C 接口(interface)使用起来更舒适:myArray.count(或 [myArray count]) 比 CFArrayGetCount(myArray) 更容易读写。只有当你真正需要时才应该使用 Core Foundation API:当你在一个没有 Objective-C 的平台上,或者当你需要 Core Foundation API 提供但 Objective-C 对象缺乏的特性时。例如,您可以在创建 CFArrayCFDictionary 时指定回调,以便存储非引用计数对象。 NSArrayNSDictionary 类不允许你这样做——它们总是假设你正在存储引用计数的对象。

  3. CF 对象只是遗留对象吗?一点也不。事实上,Nextstep 存在多年,只有 Objective-C Foundation 库,没有(公共(public))Core Foundation 库。当 Apple 需要在相同的较低级别操作系统设施之上同时支持 Carbon API 和 Cocoa API 时,他们创建(或公开)Core Foundation 来支持两者。

顺便说一句,Core Foundation 的一些内容是开源的。您可以在此处找到 Mac OS X 10.10.5 的开源部分:https://opensource.apple.com/source/CF/CF-1153.18/ .我发现 CFRunLoopCFStream 的源代码非常有用。

关于objective-c - CF 对象与 NS 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9353804/

相关文章:

objective-c - 标准委托(delegate)模式似乎与委托(delegate)目的不一致

android - 使用 Flutter Blue 发送字符串

objective-c - 动画没有通过另一个 View Controller 执行

objective-c - 转换速度 : m/s to km/h

ios - NSUserActivity 切换不适用于自定义数据

objective-c - 在 ObjC 实现文件中声明的实例变量

ios - 我如何使用这个私有(private) API?

objective-c - 为什么我的图像交换不起作用?

ios - 在 Firebase 中更改结构有多物理

ios - 通过 iOS 上的默认信使向用户选择的收件人发送短信