【问题标题】:What is the different between NSCFString and NSConstantString?NSCFString 和 NSConstantString 有什么区别?
【发布时间】:2012-04-30 12:44:51
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 当我意外地将 NSString* 分配给 UILabel* 时,我在 Xcode 调试器中观察到 UILabel 变量的 __NSCFConstantString

标签: objective-c nsstring


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      他们的接口是私有的。将它们都视为NSString,您应该没有问题。

      【讨论】:

      • 如果你试图用 isKindOfClass 比较这两个对象,你会遇到麻烦:只有当 __NSCFConstantString 是接收者时它才会起作用。只是提醒任何想了解其中一个微妙之处的人。
      • -isKindOfClass: 不用于对象比较,所以我不确定你在这里具体得到了什么。
      • 好吧,我用它来帮助它
      • @JonathanGrynspan 那你用什么?
      • -isEqual: 通常。 -isKindOfClass: 将一个对象的类与另一个类进行比较;它与将对象与另一个对象进行比较几乎没有关系。
      【解决方案4】:

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

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

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

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

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

      Reference 到源 (cmets)。

      【讨论】:

        猜你喜欢
        • 2010-10-02
        • 2011-12-12
        • 2010-09-16
        • 2012-03-14
        • 2012-02-06
        • 2011-02-25
        • 2011-11-22
        • 2015-03-26
        • 2013-08-19
        相关资源
        最近更新 更多