更高还是更低?

时间:2011-12-30 03:26:45

标签: objective-c cocoa

我是一名客观的程序员,我想知道我应该走多远(方法明智)。

例如,有NSURL然后CFURL(更低)。我不确定使用更低或更高级别是添加更多功能还是更快。

2 个答案:

答案 0 :(得分:3)

FoundationNSURL)框架类通常基于CoreFoundationCFURL)中的代码。

对于CF类型,您通常使用不透明的结构,通过使用相关函数对数据进行操作。如果您需要编写纯c代码,则需要使用CF。否则这些可能有点笨拙并且难以在某些地方使用。

Objective-C类还允许您执行其他操作,例如添加类别等。

免费桥接

有些时候您可能需要稍微混合和匹配您的代码,并且知道很多类型可以简单地投射是很方便的。例如可以使用NSString代替CFStringRef

我最近必须这样做的一个例子是当我需要进行一些网址编码时(NSString stringByAddingPercentEscapesUsingEncoding:没有完全删除它)。该函数需要CFStringRef,但通过简单的演员我可以使用NSString

CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, 
                                        (CFStringRef)stringToEncode, // <- NSString
                                        NULL,
                                        (CFStringRef)encodeChars,    // <- NSString
                                        kCFStringEncodingUTF8)

通常情况下,您可以使用{strong> 来尽可能使用Foundation类(更高级别的抽象),因为它们很可能提供相同的功能。当然会有不同的情况,例如我不得不做的网址编码。

答案 1 :(得分:2)

如果您正在编写objective-c应用程序,请使用objective-c版本。通常,CF版本存在,以便用C和C ++编写的应用程序可以与系统API通信。

在某些情况下,CF版本可以为您提供更好的控制(例如,CF集合可以配置为存储任意指针,而不仅仅是Objective-c对象)。当您需要那种更精细的控制时,请查看CF版本。否则,objective-c版本几乎总是你想要的。一般来说,他们“低级别”的用处更多的是他们更灵活(复杂性相应增加)而不是更快。

(fwiw,两者之间的速度差异将在纳秒的数量级,如果你确实需要在任何时候进行优化,那么从NS-到CF-的转换不太可能是答案)