这有效:
NSString *myVar = @"whatever";
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
这个带有可变字符串的版本产生警告“从不同的Objective-C类型分配”:
NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE
NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"];
myVar = [myNum stringValue];
在两种情况下,stringValue都返回一个NSCFString。不可变的NSString变量并不关心,可变的NSMutableString会抱怨。
P.S。有人请为NSMutableString和stringValue添加标签。
答案 0 :(得分:7)
-stringValue
返回NSString的自动释放实例,即不可变对象。即使你将它分配给可变字符串指针,它也不会使字符串变为可变,你将无法在其上调用可变字符串方法(顺便说一下,第一个代码也是如此):
NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object
处理它的正确方法是使用方便的方法创建可变字符串:
NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK
答案 1 :(得分:4)
[myNum stringValue]返回NSString,而不是NSMutableString,因此会生成警告。
如果您稍后尝试操作myVar的实例(假设它是一个可变字符串),您将得到一个异常,因为该对象根本不是一个可变字符串。
答案 2 :(得分:0)
只要将不可变字符串分配给NSMutableString *
类型的变量,就不能将它变为可变字符串。你正在做的主要是:
NSString *immutableStr = @"Mayonnaise";
NSMutableString *mutableStr = immutableStr;
在这种情况下,两个变量都指向完全相同的常量字符串对象(指针将比较相等)。您还会收到警告,因为您尝试使用类型为NSMutableString *
的不兼容值设置NSString *
类型的变量。它是不兼容的,因为NSMutableString *
提供NSString *
没有的方法和行为,因此当您尝试使用NSMutableString
的行为时,您将获得运行时错误,因为实际对象被指向变量不是NSMutableString
。