Какао: NSMutableString дает предупреждение с stringValue

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

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.

5
задан StringSection 19 January 2010 в 09:47
поделиться

3 ответа

Можно просто вызвать команду из кодового поля:

var parameter = null; // can also be any object you'd like to use as a parameter
this.PreviewReportsCommand.Execute(parameter);
-121--4746448-

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

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

Правильным способом его обработки является создание изменяемых последовательностей с помощью метода convinience:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 
-121--4746562-

[myNum StringValue] возвращает значение NSstring, а не NSMuterString, поэтому создается предупреждение.

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

4
ответ дан 13 December 2019 в 19:27
поделиться

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

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

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

0
ответ дан 13 December 2019 в 19:27
поделиться

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

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

правильный способ Обрабатывать его состоит в том, чтобы создать мулюдующую строку с методом обоищения:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"];
[tStr appendString:@"lalala"]; // OK 
7
ответ дан 13 December 2019 в 19:27
поделиться