我试图理解为什么存在CF和NS对象,它们似乎做同样的事情并且可以通过免费桥接进行互换.如果CFArray和NSArray做同样的事情,并且我可以自由地在它们之间施放,那么它们存在的重点是什么?是否有关于何时使用其中一个的经验法则?CF对象只是旧框架中的遗留对象吗?任何对此的见解将不胜感激.
rob*_*off 64
按顺序回答您的问题:
它们的存在意义何在?有几个原因.
如果你想提供一个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库.
你什么时候应该使用其中一个?通常,您应该尽可能使用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
以便存储非引用计数对象.在NSArray
和NSDictionary
类不允许你这样做-他们总是假设你存储引用计数的对象.
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章也解释了它是如何工作的).但对大多数目的而言,这并不重要.正如马特所说,你通常可以假装NSArray
a与a相同CFArrayRef
.在许多情况下这并不是真的,但它有时是正确的,而且大部分时间都足够接近.这与说含有@"stuff"
相同是一样的.这大部分都是真的,但并不完全正确.NSString
stuff
当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.
归档时间: |
|
查看次数: |
9503 次 |
最近记录: |