为什么Objective C提供类NSString和子类NSMutableString而不仅仅提供NSMutableString? NSString不等同于“const NSMutableString”吗?
在C ++中,你只有一个字符串类,std :: string,如果你想要一个常量,你可以声明一个const std:string。
我很想知道为什么我不应该只是在任何地方使用NSMutableString而且从不打扰NSString?必须有一个理由,或者语言设计师不会同时提供这两个原因。也许它占用更少的存储空间?
答案 0 :(得分:6)
只有在字符串不可变时才允许,甚至可能存在优化。
实际上正在运行
NSString *A = @"Bob";
NSString *B = @"Bob";
调试器中的立即显示它们都是指向同一字符串的指针。事实上
NSString *C = [NSString stringWithString:@"Bob"];
NSString *D = [A copy];
两者都指向相同的内存地址。同时
NSString *E = [NSMutableString stringWithString:@"Bob"];
指向不同的字符串。
所以是的,在某些情况下使用NSStrings更有效。通常,cocoa适合返回字符串的新副本而不是编辑过的字符串。但是,我不能说你不应该在任何地方使用可变字符串,但它似乎违反了框架的一般准则。
在我自己的工作中,我倾向于只使用可变变体,我需要直接编辑。除了你需要一个const之外,它只是从一切可变的C / C ++风格后退一点,除非你需要可变性,否则一切都是const。
答案 1 :(得分:5)
这两个类的原因与您有时使用std :: string有时使用const std :: string的原因相同。但是,与C ++不同,Objective-C没有const方法,因此它们将const-non-const-方法分成两个不同的类。在许多核心类中也可以看到这一点,例如NSArray(NSMutableArray),NSDictionary(NSMutableDictionary)等。
答案 2 :(得分:0)
我会说一般规则是“不要使用一个目的是提供你不需要的功能的类”。如果需要直接更改字符串的内容,请使用NSMutableString
。如果没有,请使用NSString
。在大小和它们占用的堆空间方面,类本身应该非常相似。
答案 3 :(得分:0)
我认为使用不可变字符串是编译器的一个提示,它可以通过知道它不会改变来执行优化。