我是一名客观的程序员,我想知道我应该走多远(方法明智)。
例如,有NSURL然后CFURL(更低)。我不确定使用更低或更高级别是添加更多功能还是更快。
答案 0 :(得分:3)
Foundation
(NSURL
)框架类通常基于CoreFoundation
(CFURL
)中的代码。
对于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-的转换不太可能是答案)