5

这有效:

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 抱怨。

PS 有人请为 NSMutableString 和 stringValue 添加标签。

4

3 回答 3

7

-stringValue返回自动释放的 NSString 实例,即不可变对象。即使您将它分配给可变字符串指针,它也不会使字符串可变,并且您将无法在其上调用可变字符串方法(顺便说一句,对于您的第一个代码也是如此):

NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object

处理它的正确方法是使用方便的方法创建可变字符串:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 
于 2010-01-19T08:45:27.873 回答
4

[myNum stringValue] 返回一个 NSString,而不是 NSMutableString,所以这会产生警告。

如果您稍后尝试操作 myVar 的实例(假设它是一个可变字符串),您会得到一个异常,因为该对象根本不是一个可变字符串。

于 2010-01-19T08:46:41.210 回答
0

您不能简单地通过将不可变字符串分配给类型变量来将其变为可变字符串NSMutableString *。你在做什么基本上是:

NSString *immutableStr = @"Mayonnaise";
NSMutableString *mutableStr = immutableStr;

在这种情况下,两个变量都指向完全相同的常量字符串对象(指针将比较相等)。您还将收到警告,因为您正尝试NSMutableString *使用不兼容的 type 值设置 type变量NSString *。它是不兼容的,因为它NSMutableString *提供了不兼容的方法和行为NSString *,所以当你尝试使用NSMutableString's 的行为时,你会得到运行时错误,因为变量指向的实际对象不是NSMutableString.

于 2010-01-19T10:08:53.190 回答