代码之家  ›  专栏  ›  技术社区  ›  progrmr

同时拥有NSMutableString和NSString的目的是什么?

  •  5
  • progrmr  · 技术社区  · 14 年前

    在C++中,只有一个字符串类,即STD::string,如果需要常数,则声明const STD:String。

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   Daniel Yankowsky    14 年前

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

        2
  •  6
  •   Bryan McLemore    14 年前

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

    事实上正在运行

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

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

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

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

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

    指向不同的字符串。

    在我自己的工作中,我倾向于只使用需要直接编辑内容的可变变体。这与C/C++风格的一切都是可变的,除非你需要一个常量,否则一切都是常量,除非你需要可变。

        3
  •  0
  •   Dave DeLong    14 年前

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

        4
  •  0
  •   Kai Huppmann    14 年前

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