我将对象变量声明为NSString
但是当我使用XCode查看我的对象时,我看到有两种类型的String,似乎系统自动转移到另一个:
他们之间有什么不同?它们是否可以与其他人互换。另外,两个条件变成另一个的条件是什么?
感谢。
答案 0 :(得分:13)
它们都是NSString
的具体子类。 __NSCFString
是在运行时通过Foundation或Core Foundation创建的,__NSCFConstantString
是在编译时创建的CFSTR("...")
常量或@"..."
常量。
他们的界面是私人的。将它们视为NSString
,你应该没有问题。
答案 1 :(得分:3)
它似乎是编译器完成的优化。我猜测转换为NSCFConstantString
的字符串等于出于性能原因而缓存的常量之一。您的NSCFString
只是一个免费的桥接字符串,可以是NSString
或CFString
。有关详细信息,请参阅this article。
答案 2 :(得分:2)
据我所知,NSCFConstantString
是NSString
的一种实现,它将字符串数据保存在代码存储器中。使用@"string"
常量时,编译器会创建它的实例。由于子类/超类关系,您可以在任何可以使用NSCFConstantString
的地方使用NSString
,但显然不是相反。
答案 3 :(得分:0)
下一个示例是将NSString转换为NSCFConstantString的一个好处:
例如 - 如果要编写
,则在tableView的方法cellForRowAtIndexPath中NSString *ident = @"identificator";
NSLog(@"%p", ident);
比每个小区的相同地址。但随着 NSLog(@"%p",& ident)它将是每个单元格的不同地址。
NSString ident = @"识别器"是一个特例 - 它被创建为 一个__NSCFConstantString类,所以所有相等的字符串文字将共享 相同的内存地址,以优化内存使用。 & ident将得到一个 指向NSString并且将具有的局部变量的地址 NSString **类型。
Reference来源(评论)。