Cocoa:NSMutableString使用stringValue发出警告

Str*_*ion 5 cocoa objective-c nsstring nsmutablestring

这有效:

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

Vla*_*mir 7

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

NSMutableString* tStr = @"lala";
[tStr appendString:@"lalala"]; // CRASH! Attempting to mutate immutable object
Run Code Online (Sandbox Code Playgroud)

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

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 
Run Code Online (Sandbox Code Playgroud)

  • 或者你可以使用`[aString mutableCopy]`. (2认同)