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

推荐答案

按顺序回答您的问题:

  1. 它们都存在的意义是什么?有几个原因.

    如果你想提供一个C API,比如Carbon API,你需要像数组和引用的计数对象的字典之类的东西,你需要一个库,比如核心基础(它提供CFArray),当然它需要一个C API.

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

    如果你想写一个低级库,比如说与操作系统内核接口,而你又不想要Objective-C消息传递的开销,你需要一个C API.

    这些都是有核心基础、纯C库的好理由.

    但是,如果您想在Objective-C中提供更高级别、更令人愉快的API,那么您需要表示数组、字典、引用计数对象等的Objective-C对象.所以你需要基础,这是一个Objto-C库.

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

  3. CF对象只是遗留对象吗?一点也不.事实上,NeXSTEP已经存在多年,只是Objy-C基金会库和无(公共)核心基础库.当苹果需要支持同样的低级别操作系统设施之上的Carbon API和可可API时,他们创建(或公开)支持两者的核心基础.

顺便说一下,一些核心基础是开源.你可以在这里找到Mac OS X 10.10.5的开源部分:https://opensource.apple.com/source/CF/CF-1153.18/.我发现CFRunLoopCFStream的源代码非常有用.

Objective-c相关问答推荐

Objective-C struct 的默认值以及如何测试

在 iOS 7 上,如果最终包含在选项卡栏控制器中,则使用工具栏推送控制器会留下不可用空间的间隙

在 10.9 上以编程方式启用对辅助设备的访问

animateWithDuration:animations: 会阻塞主线程吗?

Objective C 代码是否有 github markdown 语言标识符?

`-fembed-bitcode` 和 BITCODE_GENERATION_MODE 有什么区别?

iOS 7 - viewDidLoad 和 viewDidAppear 之间的区别

Interface Builder 中的 IBOutletCollection 集排序

如何在 iPhone 上画出讲话泡泡?

未知类型名称类;您指的是 'Class' 吗?

iPhone 键盘、完成按钮和 resignFirstResponder

如何在 ios 8 的 alertview 中添加文本输入?

#ifdef DEBUG 与 #if DEBUG

Objective C 中的调用方法或发送消息

从 NSRange 创建 UITextRange

Xcode:无法判断应用程序包

Cocoapods ld:找不到-lPods-Projectname 的库

使用 respondsToSelector 时 suppress '...' is deprecated

cellForRowAtIndexPath 是如何工作的?

如何使用图像和标签制作自定义 UIBarButtonItem?