我注意到许多库使用的变量和函数都以 开头CF
和结尾Ref
,例如:CFStringRef
、CFURLRef
、CFHTTPMessageCreateRequest
等...
1)CF
代表什么?我不知道为什么苹果对这种缩写词只字未提。
2)使用(例如)CFStringRef
而不是使用有什么好处NSString
?
3)如果使用这些CF
变量更好,那么我应该用 替换所有常规变量NSString
吗CFStringRef
?
我注意到许多库使用的变量和函数都以 开头CF
和结尾Ref
,例如:CFStringRef
、CFURLRef
、CFHTTPMessageCreateRequest
等...
1)CF
代表什么?我不知道为什么苹果对这种缩写词只字未提。
2)使用(例如)CFStringRef
而不是使用有什么好处NSString
?
3)如果使用这些CF
变量更好,那么我应该用 替换所有常规变量NSString
吗CFStringRef
?
Objective-C 是建立在 c 语言之上的,CF(Core Foundation)类型是 C 结构体,通常被包裹在一个 Objective-C 对象中(CFStringRef 被 NSString 包裹,CGImageRef 被 UIImage 包裹等等)
除非您有充分的理由,否则请使用 Objective-C 级别的代码。内存管理要简单得多(ARC 是自动的),通常你的代码会更干净
编辑:正如@omz 所指出的,包裹对于 NSString 是不正确的,它是桥接的,其他一些答案解释了这个概念
从苹果文档:
Core Foundation 是一个具有一组编程接口的库,概念上源自基于 Objective-C 的 Foundation 框架,但用 C 语言实现。为此,Core Foundation 在 C 中实现了一个受限对象模型。Core Foundation 定义了封装数据和函数的不透明类型,以下称为“对象”。</p>
这基本上是总结了差异。Core Foundation (CF) 以 Foundation 框架的形式提供语言附带的许多 Objective-C 实现的纯 C 实现。NS 代表“NeXTSTEP”是正确的,它是构成 Mac OS X 大部分内容的操作系统的名称,但它也表明一个类型是一个 Objective C 类。CF 类型是纯 C 实现,并带有 C 函数来操作它们。
有时,使用 CF 结构会比 NS 等效结构带来优势。例如,CFDictionary 对值和键的限制比 NSDictionary 少。但除非出现任何此类问题,否则您没有理由更改对它们的 CF 等效项的引用。ARC 也不能轻松地与 CF 类型一起使用。
也可以使用免费桥接在 CF 和 Foundation 之间进行映射。
CF
代表核心基金会。如果您有兴趣了解更多相关信息,可以从阅读Core Foundation Design Concepts Guide开始。还有 Core Foundation 的String Programming Guide 和 Core Foundation的Collections Programming Topics,它将告诉您更多关于CFStringRef
各种集合类型(数组、字典等)的信息。
基本上,Core Foundation 是一个相对低级的框架,它做一些与 Foundation 相同的事情,但它是用 C 编写的,而不是 Objective-C。一些核心基础“类”(它们不是真正的类)也与它们的 Objective-C 对应物“免费桥接”,例如,可以将 aCFStringRef
转换为 an NSString *
(尽管使用 ARC 稍微复杂一点)。
如果您不需要仅在 Core Foundation 中可用的特定 API,则绝对没有必要使用它来代替 Foundation。Core Foundation 代码的可读性往往比 Objective-C 低,并且也使内存管理更加复杂。
但是,熟悉 Core Foundation 的基本概念可能会非常有用,因为还有很多其他框架是类似构建的。Core Text 和 Core Graphics 就是示例——虽然它们不正式属于 Core Foundation,但它们使用相同的命名和内存管理约定。还有一些 API 仅在 Core Foundation 中可用并且没有 Foundation 对应物 - <code>CFBagRef 或CFBitVector
(两种集合类型)就是示例。