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

それを処理する正しい方法は、convinience メソッドを使用して変更可能な文字列を作成することです。

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

[myNum stringValue] は NSMutableString ではなく NSString を返すため、これにより警告が生成されます。

後で myVar のインスタンスを操作しようとすると (変更可能な文字列であると仮定して)、オブジェクトが変更可能な文字列ではないため、例外が発生します。

于 2010-01-19T08:46:41.210 に答える