13

我将对象变量声明为aNSString 但是当我使用XCode查看我的对象时,我看到有两种类型的String,似乎系统自动转移到另一种:

在此处输入图像描述

它们之间有什么不同?它们是否可以相互替换。另外,两个变成另一个的条件是什么?

谢谢。

4

4 回答 4

18

它们都是NSString. __NSCFString是在运行时通过 Foundation 或 Core Foundation 创建的,__NSCFConstantString而是CFSTR("...")常量或@"..."常量,在编译时创建。

它们的接口是私有的。把它们都当作NSString,你应该没有麻烦。

于 2012-04-19T02:24:19.487 回答
3

据我所知,NSCFConstantString是一种NSString将字符串数据保存在代码内存中的实现。@"string"当您使用常量时,编译器会创建它的实例。由于子类/超类关系,您可以在任何可以使用NSCFConstantString的地方NSString使用,但显然不是相反。

于 2012-04-19T02:17:39.320 回答
3

它似乎是编译器完成的优化。我猜想转换为 an 的字符串NSCFConstantString等于出于性能原因缓存的常量之一。你NSCFString只是一个免费的桥接字符串,可以是一个NSString或一个CFString。有关更多信息,请参阅本文

于 2012-04-19T02:17:47.713 回答
0

将 NSString 转换为 NSCFConstantString 的好处之一是下一个示例:

例如 - 在 tableView 的方法 cellForRowAtIndexPath 中,如果你会写

NSString *ident = @"identificator"; 
NSLog(@"%p", ident);

比每个单元格的地址都相同。但是对于 NSLog(@"%p", &ident) ,每个单元格的地址都会不同。

NSString ident = @"identificator" 是一种特殊情况 - 它被创建为 __NSCFConstantString 类,因此所有相等的字符串文字将共享相同的内存地址以优化内存使用。&ident 将获得一个指向 NSString 的局部变量的地址,并且将具有 NSString** 类型。

参考来源(评论)。

于 2017-04-17T16:44:13.007 回答