Какао: NSMutableString выдает предупреждение с помощью stringValue - PullRequest
5 голосов
/ 19 января 2010

Это работает:

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 ]

7 голосов
/ 19 января 2010

-stringValue возвращает автоматически выпущенный экземпляр NSString, который является неизменным объектом. Даже если вы назначите его указателю изменяемой строки, это не сделает изменяемой строку, и вы не сможете вызывать изменяемые строковые методы для нее (кстати, то же самое остается верным для вашего первого кода):

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

Правильный способ справиться с этим - создать изменяемую строку методом удобства:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 
4 голосов
/ 19 января 2010

[myNum stringValue] возвращает NSString, а не NSMutableString, поэтому будет выдано предупреждение.

Если вы попытаетесь позже манипулировать экземпляром myVar (при условии, что это изменяемая строка), вы получите исключение, поскольку объект вообще не является изменяемой строкой.

0 голосов
/ 19 января 2010

Невозможно преобразовать неизменяемую строку в изменяемую, просто назначив ее переменной типа NSMutableString *. То, что вы делаете, по сути:

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

Обе переменные в этом случае указывают на один и тот же постоянный строковый объект (указатели будут сравниваться одинаково). Вы также получите предупреждение, потому что вы пытаетесь установить переменную типа NSMutableString * с несовместимым значением типа NSString *. Это несовместимо, поскольку NSMutableString * предоставляет методы и поведение, которых нет у NSString *, поэтому при попытке использовать поведение NSMutableString вы получите ошибки времени выполнения, поскольку фактический объект, на который указывает переменная, не является NSMutableString.

...