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

pro*_*rmr 5 objective-c nsstring

为什么Objective C提供类NSString和子类NSMutableString而不仅仅提供NSMutableString?NSString不等同于"const NSMutableString"吗?

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

我有兴趣知道为什么我不应该只在任何地方使用NSMutableString并且从不打扰NSString?必须有一个理由,或者语言设计师不会同时提供这两个原因.也许它占用更少的存储空间?

Bry*_*ore 6

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

实际上跑步

NSString *A = @"Bob";
NSString *B = @"Bob";
Run Code Online (Sandbox Code Playgroud)

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

NSString *C = [NSString stringWithString:@"Bob"];
NSString *D = [A copy];
Run Code Online (Sandbox Code Playgroud)

两者都指向相同的内存地址.与此同时

NSString *E = [NSMutableString stringWithString:@"Bob"];
Run Code Online (Sandbox Code Playgroud)

指向不同的字符串.

所以是的,在某些情况下使用NSStrings更有效.一般来说,cocoa适合返回字符串的新副本而不是编辑过的字符串.但是,我不能说你不应该在任何地方使用可变字符串,但它似乎违反了框架的一般准则.

在我自己的工作中,我倾向于只使用可变变体,我需要直接编辑.除了你需要一个const之外,它只是从一切可变的C/C++风格后退一点,除非你需要可变性,否则一切都是const.


Dan*_*sky 5

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