CF对象与NS对象

Eri*_*ric 45 objective-c ios

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

rob*_*off 64

按顺序回答您的问题:

  1. 它们的存在意义何在?有几个原因.

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

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

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

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

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

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

  3. CF对象只是遗留对象吗?一点也不.事实上,Nextstep已经存在多年,只有Objective-C Foundation库和没有(公共)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/ .我找到了源代码CFRunLoop并且CFStream非常有用.


Rob*_*ier 11

Core Foundation是各种常见数据结构的C API.大多数这些数据结构在Cocoa中具有等价物,但不是全部.大多数相同的是免费桥接,允许它们互换使用,但不是全部.

免费桥接是一个非常聪明的实现技巧.如果您想了解基础细节,请参阅@Matt Wilding指出的ridiculous_fish帖子.它是关于这个主题最权威的(以及对iOS的主要影响:PTL第19章也解释了它是如何工作的).但对大多数目的而言,这并不重要.正如马特所说,你通常可以假装NSArraya与a相同CFArrayRef.在许多情况下这并不是真的,但它有时是正确的,而且大部分时间都足够接近.这与说含有@"stuff"相同是一样的.这大部分都是真的,但并不完全正确.NSStringstuff

当OS 9移动到OS X时,提供对类似Objective-C的数据结构的C访问非常方便.今天,许多低级框架都出于性能原因而公开了C API.你不应该把CF视为"遗产"或"内部".您应该将其视为低级别,并且只应在需要它提供的功能时使用它,或者正在处理需要它的低级框架.

CF对象通常比NS对象更灵活.例如,CFDictionaryRef可以包含非对象键和值,而NSDictionary不能.(当然他们是免费的桥接,所以你可以创建一个非保留CFDictionaryRef,然后把它当作一个NSDictionary.Tricky ......)

当Apple发布新框架时,您会注意到他们经常首先公开C API,然后再添加Objective-C API.这就是学习Core Foundation的好主意,即使你每天都不使用它.但是在可能的情况下,您通常应该使用ObjC.

  • @"string"实际上是一个`__NSCFConstantString`,它是`NSString`的(sort-of)子类.("Sort-of"因为它是一个免费的桥类,它与子类不完全相同.)常量字符串在__TEXT段中,而不是堆(以及它们的底层cstring,它们是单独存储的) ,他们忽略了"retain"和"release"调用. (5认同)