这会产生一个不可变的字符串对象:
NSString* myStringA = @"A"; //CORRECTED FROM: NSMutableString* myStringA = @"A";
Run Code Online (Sandbox Code Playgroud)
这会产生一个可变的字符串对象:
NSMutableString* myStringB = [NSMutableString stringWithString:@"B"];
Run Code Online (Sandbox Code Playgroud)
但是这两个对象都被报告为同一种对象,"NSCFString":
NSLog(@"myStringA is type: %@, myStringB is type: %@",
[myStringA class], [myStringB class]);
Run Code Online (Sandbox Code Playgroud)
那么什么是在内部区分这些对象,以及如何测试它,以便我可以轻松地确定一个神秘的字符串变量是不可变的还是可变的,然后再做一些邪恶的事情呢?
这有效:
NSString *myVar = @"whatever";
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
Run Code Online (Sandbox Code Playgroud)
这个带有可变字符串的版本产生警告"从不同的Objective-C类型分配":
NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,stringValue都返回一个NSCFString.不可变的NSString变量并不关心,可变的NSMutableString抱怨.
PS有人请为NSMutableString和stringValue添加标签.