我将对象变量声明为aNSString
但是当我使用XCode查看我的对象时,我看到有两种类型的String,似乎系统自动转移到另一种:
它们之间有什么不同?它们是否可以相互替换。另外,两个变成另一个的条件是什么?
谢谢。
我将对象变量声明为aNSString
但是当我使用XCode查看我的对象时,我看到有两种类型的String,似乎系统自动转移到另一种:
它们之间有什么不同?它们是否可以相互替换。另外,两个变成另一个的条件是什么?
谢谢。
它们都是NSString
. __NSCFString
是在运行时通过 Foundation 或 Core Foundation 创建的,__NSCFConstantString
而是CFSTR("...")
常量或@"..."
常量,在编译时创建。
它们的接口是私有的。把它们都当作NSString
,你应该没有麻烦。
据我所知,NSCFConstantString
是一种NSString
将字符串数据保存在代码内存中的实现。@"string"
当您使用常量时,编译器会创建它的实例。由于子类/超类关系,您可以在任何可以使用NSCFConstantString
的地方NSString
使用,但显然不是相反。
它似乎是编译器完成的优化。我猜想转换为 an 的字符串NSCFConstantString
等于出于性能原因缓存的常量之一。你NSCFString
只是一个免费的桥接字符串,可以是一个NSString
或一个CFString
。有关更多信息,请参阅本文。
将 NSString 转换为 NSCFConstantString 的好处之一是下一个示例:
例如 - 在 tableView 的方法 cellForRowAtIndexPath 中,如果你会写
NSString *ident = @"identificator";
NSLog(@"%p", ident);
比每个单元格的地址都相同。但是对于 NSLog(@"%p", &ident) ,每个单元格的地址都会不同。
NSString ident = @"identificator" 是一种特殊情况 - 它被创建为 __NSCFConstantString 类,因此所有相等的字符串文字将共享相同的内存地址以优化内存使用。&ident 将获得一个指向 NSString 的局部变量的地址,并且将具有 NSString** 类型。
参考来源(评论)。