NSCFString和NSConstantString之间有什么不同?

时间:2012-04-19 02:04:30

标签: objective-c nsstring

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

enter image description here

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

感谢。

4 个答案:

答案 0 :(得分:13)

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

他们的界面是私人的。将它们视为NSString,你应该没有问题。

答案 1 :(得分:3)

它似乎是编译器完成的优化。我猜测转换为NSCFConstantString的字符串等于出于性能原因而缓存的常量之一。您的NSCFString只是一个免费的桥接字符串,可以是NSStringCFString。有关详细信息,请参阅this article

答案 2 :(得分:2)

据我所知,NSCFConstantStringNSString的一种实现,它将字符串数据保存在代码存储器中。使用@"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来源(评论)。