使用CF变量而不是NS变量的好处

时间:2012-08-06 08:31:21

标签: iphone objective-c ios cocoa-touch

我注意到许多库使用的变量和函数以CF开头,以Ref结尾,例如:CFStringRefCFURLRef,{{1}等等...

1)CFHTTPMessageCreateRequest代表什么?我不知道为什么苹果不会说这些缩写。

2)使用(例如)CF而不是使用CFStringRef的好处是什么?

3)如果最好使用这些NSString变量,那么我是否应该将所有常规变量CF替换为NSString

3 个答案:

答案 0 :(得分:2)

Objective-C是基于c语言构建的,CF(Core Foundation)类型是C结构,通常包装在Objective-C对象中(CFStringRef由NSString包装,CGImageRef由UIImage包装等)

除非您有充分的理由,否则请使用Objective-C级代码。内存管理要简单得多(ARC自动执行),一般来说你的代码会更清晰

编辑:正如@omz指出的那样,对于NSString,包装是不正确的,它是桥接的,其他一些答案解释了这个概念

答案 1 :(得分:2)

来自Apple documentation

  

Core Foundation是一个库,其中包含一组编程接口,这些接口概念性地源自基于Objective-C的Foundation框架,但是使用C语言实现。为此,Core Foundation在C中实现了一个有限的对象模型.Core Foundation定义了封装数据和函数的opaque类型,以下称为“对象”。

这基本上总结了差异。 Core Foundation(CF)提供了许多Objective-C实现的纯C实现,这些实现与Foundation框架形式的语言一起提供。 NS代表“NeXTSTEP”是正确的,它是在Mac OS X的大部分时间形成absis的操作系统的名称,但它也表明类型是Objective C类。 CF类型是纯C实现,并带有C函数来操作它们。

有时候使用CF结构比NS等效物具有优势。例如,CFDictionary对值和键的限制比NSDictionary少。但除非出现任何此类问题,否则您没有理由更改对其CF等价物的引用。对于CF类型,ARC也不会那么容易。

也可以使用toll-free bridging在CF和Foundation之间进行映射。

答案 2 :(得分:2)

CF代表核心基金会。如果您有兴趣了解更多相关信息,可以先阅读Core Foundation Design Concepts Guide。还有String Programming Guide for Core FoundationCollections Programming Topics for Core Foundation,它们会告诉您有关CFStringRef和各种集合类型(数组,字典等)的更多信息。

基本上,Core Foundation是一个相对较低级别的框架,它执行与Foundation相同的一些操作,但是用C语言编写,而不是用Objective-C编写。一些Core Foundation“类”(它们不是真正的类)也与它们的Objective-C对应物“免费桥接”,例如,可以将CFStringRef转换为NSString * (虽然ARC有点复杂)。

如果您不需要仅在Core Foundation中可用的特定API,则绝对不需要使用它而不是Foundation。 Core Foundation代码的可读性往往低于Objective-C,并且使内存管理更加复杂。

然而,熟悉Core Foundation的基本概念可能非常有用,因为还有相当多的其他框架是相似的。核心文本和核心图形是示例 - 虽然它们不正式属于Core Foundation,但它们使用相同的命名和内存管理约定。还有一些API仅在Core Foundation中可用且没有Foundation对应的 - CFBagRefCFBitVector(两种集合类型)都是示例。