7

我没有得到 iOS 中 CFString 和 NSString 之间的区别。任何人都可以为此建议链接或正确答案。提前致谢。

4

2 回答 2

11

NSString是 的基金会对应物CFString。这意味着它们在内存中具有完全相同的内存布局。

这种架构背后的原因是历史性的,可以追溯到 NeXTSTEP 和 MacOS 9 之间的“碰撞”。

由于免费桥接机制,许多 CF 对象具有可互换的 NS 对象(其他示例是CFArray/ NSArrayCFData/ NSData、...),因此从实际角度来看,您可以将它们视为同一事物。

这是关于该主题的一篇不错的文章:http ://ridiculousfish.com/blog/posts/bridge.html

作为额外的好东西,这是我关于如何在 ARC 环境中执行桥接的答案:NSString to CFStringRef and CFStringRef to NSString in ARC?

于 2013-08-16T13:17:55.690 回答
1

编辑:此答案适用于非 ARC 环境。

根据 iOS 开发者库:

CFString 与 Cocoa Foundation 对应的 NSString 是“免费桥接”。这意味着 Core Foundation 类型在函数或方法调用中可以与桥接的 Foundation 对象互换。因此,在看到 NSString * 参数的方法中,可以传入 CFStringRef,在看到 CFStringRef 参数的函数中,可以传入 NSString 实例。这也适用于 NSString 的具体子类。有关免费桥接的更多信息,请参阅“免费桥接类型”

将 NSString 转换为 CFStringRef:

NSString *test = @"Everyone is created equal.";
CFStringRef string =  (CFStringRef) test;

将 CFStringRef 转换为 NSString:

NSString *backToNSString =  (NSString *) string;
于 2013-08-16T14:23:12.383 回答