【问题标题】:What is the purpose of having both NSMutableString and NSString?同时拥有 NSMutableString 和 NSString 的目的是什么?
【发布时间】:2010-12-17 12:00:20
【问题描述】:

为什么 Objective C 提供了类 NSString 和子类 NSMutableString 而不仅仅是提供 NSMutableString? NSString 不就等同于“const NSMutableString”吗?

在 C++ 中,你只有一个字符串类,std::string,如果你想要一个常量,你可以声明一个 const std:string。

我很想知道为什么我不应该在任何地方都使用 NSMutableString 而从不打扰 NSString?一定是有原因的,否则语言设计者不会同时提供这两者。也许它占用更少的存储空间或其他什么?

【问题讨论】:

    标签: objective-c nsstring


    【解决方案1】:

    很有可能,甚至很可能,只有在字符串不可变时才允许进行优化。

    其实在运行

    NSString *A = @"Bob";
    NSString *B = @"Bob";
    

    在调试器中立即显示它们都是指向同一个字符串的指针。其实

    NSString *C = [NSString stringWithString:@"Bob"];
    NSString *D = [A copy];
    

    两者都指向相同的内存地址。同时

    NSString *E = [NSMutableString stringWithString:@"Bob"];
    

    指向不同的字符串。

    所以是的,在某些情况下使用 NSStrings 更有效。一般来说,可可有助于返回字符串的新副本,而不是编辑过的。但是,我不能真正争辩说您不应该在任何地方使用可变字符串,但它似乎确实违反了框架的一般准则。

    在我自己的工作中,我倾向于只在需要直接编辑的地方使用可变变体。除非你需要一个 const,否则一切都是可变的,除非你需要可变性,否则一切都是 const。

    【讨论】:

    • NSString *D = [E copy]; 会指向E 还是另一个新字符串?
    【解决方案2】:

    这两个类的原因与您有时使用 std::string 有时使用 const std::string 的原因相同。然而,与 C++ 不同的是,Objective-C 没有 const 方法,因此它们将 const- 与非 const- 方法分离为两个不同的类。这在很多核心类中也可以看到,比如NSArray(NSMutableArray)、NSDictionary(NSMutableDictionary)等。

    【讨论】:

      【解决方案3】:

      我想说一般规则是“不要使用旨在提供您不需要的功能的类”。如果您需要直接更改字符串的内容,请使用NSMutableString。如果没有,请使用NSString。就大小和占用的堆空间而言,这些类本身应该非常相似。

      【讨论】:

      • 我知道使用哪个类。我的问题是为什么语言设计者选择将功能分成两个类?
      • 因为拆分功能允许编译器和运行时在不需要额外功能的情况下提供更高的性能。
      【解决方案4】:

      我认为不可变字符串的使用是对编译器的提示,它可以通过知道它不会改变来执行优化。

      【讨论】:

      • 我的测试表明它也会影响运行时的行为方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-03
      • 2016-08-30
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      相关资源
      最近更新 更多