我试图理解为什么同时存在CF和NS对象,它们似乎做同样的事情,并且通过免费桥接可以互换.比如说,如果CFArray和NSArray做同样的事情,我可以在它们之间自由切换,那么它们存在的意义是什么?关于什么时候使用一个而不是另一个,有经验法则吗?CF对象只是旧框架中的遗留对象吗?如能对此有所了解,将不胜感激.
我试图理解为什么同时存在CF和NS对象,它们似乎做同样的事情,并且通过免费桥接可以互换.比如说,如果CFArray和NSArray做同样的事情,我可以在它们之间自由切换,那么它们存在的意义是什么?关于什么时候使用一个而不是另一个,有经验法则吗?CF对象只是旧框架中的遗留对象吗?如能对此有所了解,将不胜感激.
按顺序回答您的问题:
它们都存在的意义是什么?有几个原因.
如果你想提供一个C API,比如Carbon API,你需要像数组和引用的计数对象的字典之类的东西,你需要一个库,比如核心基础(它提供CFArray
),当然它需要一个C API.
如果您想为第三方编写在Windows上使用的库(例如),您需要提供一个C API.
如果你想写一个低级库,比如说与操作系统内核接口,而你又不想要Objective-C消息传递的开销,你需要一个C API.
这些都是有核心基础、纯C库的好理由.
但是,如果您想在Objective-C中提供更高级别、更令人愉快的API,那么您需要表示数组、字典、引用计数对象等的Objective-C对象.所以你需要基础,这是一个Objto-C库.
你什么时候应该使用其中一种?一般来说,只要有可能,就应该使用Objective-C类(例如NSArray
),因为Objective-C接口更易于使用:myArray.count
(或[myArray count]
)比CFArrayGetCount(myArray)
更易于读写.只有当你真正需要的时候,你才应该使用核心基础API:当你在一个没有Objto-C的平台上,或者当你需要核心基础API提供的特性,但是Objy-C对象缺少的时候.例如,您可以在创建CFArray
或CFDictionary
时指定回调,以便存储非引用计数的对象.NSArray
和NSDictionary
类不允许您这样做——它们总是假设您正在存储引用计数的对象.
CF对象只是遗留对象吗?一点也不.事实上,NeXSTEP已经存在多年,只是Objy-C基金会库和无(公共)核心基础库.当苹果需要支持同样的低级别操作系统设施之上的Carbon API和可可API时,他们创建(或公开)支持两者的核心基础.
顺便说一下,一些核心基础是开源.你可以在这里找到Mac OS X 10.10.5的开源部分:https://opensource.apple.com/source/CF/CF-1153.18/.我发现CFRunLoop
和CFStream
的源代码非常有用.