Cocoa:NSMutableString使用stringValue发出警告

时间:2010-01-19 08:33:08

标签: objective-c cocoa nsstring nsmutablestring

这有效:

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添加标签。

3 个答案:

答案 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