2010-01-19 9 views
5

Esto funciona:Cacao: NSMutableString avisa con stringValue

NSString *myVar = @"whatever"; 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 

Esta versión con una cuerda mutable Genera una advertencia de "asignación de tipo distinto de Objective-C":

NSMutableString *myVar = [NSMutableString stringWithString:@"whatever"]; //UPDATE: CORRECTED CODE 

NSDecimalNumber *myNum = [NSDecimalNumber decimalNumberWithString:@"10"]; 

myVar = [myNum stringValue]; 

En ambos casos stringValue está volviendo un NSCFString. La variable NSString inmutable no le importa, el NSMutableString mutable se queja.

P.S. alguien por favor agregue etiquetas para NSMutableString y stringValue.

+0

¿Puede publicar la advertencia dada? –

+0

(Ah, puedo publicar comentarios ya que todavía estoy cocinado ...). Laurent, es solo una advertencia amarilla de Xcode: "Advertencia: asignación del tipo distinto de Objective-C". – StringSection

+0

Las respuestas de Phillipe y Vladimir han explicado la situación. El problema es que el objeto stringValue es inmutable, por lo que no se puede asignar a una variable de cadena mutable. (Vladimir también señala que mi código NSMutableString * myVar = @ "whatever"; es inherentemente ilegal aunque no crea la advertencia en cuestión.) ¡Gracias! – StringSection

Respuesta

6

-stringValue devuelve la instancia autorrelada de NSString, que es un objeto inmutable. Incluso si lo ha asignado a la cadena mutable puntero que no hará que la cadena mutable y usted no será capaz de llamar a métodos de las cadenas mutables en él (por cierto, el mismo se mantiene fiel a su primera código):

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

la forma correcta de manejar que es crear cadena mutable con el método de confort:

NSMutableString* tStr = [NSMutableString stringWithString:@"lala"]; 
[tStr appendString:@"lalala"]; // OK 
+2

O puede usar '[aString mutableCopy]'. –

+0

Tenga en cuenta que, según el comentario de Vladimir, he corregido el código en la publicación original para mostrar inicialmente una cadena NSMutableString adecuada. – StringSection

+0

cuando asigna una cadena como: myVar = [myNum stringValue]; descarta todas las asignaciones anteriores; no importa cómo haya creado previamente su cadena, ahora myVar contiene el resultado de -stringValue y se pierde el valor anterior. – Vladimir

4

[myNum stringValue] devuelve un NSString, no NSMutableString, así que esto generará la advertencia.

Si intenta manipular la instancia de myVar más adelante (suponiendo que sea una cadena mutable), obtendría una excepción, porque el objeto no es una cadena mutable.

0

No se puede convertir una cadena inmutable en una mutable simplemente asignándola a una variable de tipo NSMutableString *. Lo que está haciendo es esencialmente:

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

Ambas variables en este caso el punto de exactamente el mismo objeto constante de cadena (los punteros compararán iguales). También recibirá una advertencia porque está intentando establecer una variable de tipo NSMutableString * con un valor incompatible de tipo NSString *. No es compatible porque NSMutableString * proporciona métodos y comportamientos que NSString * no, por lo que cuando intente utilizar el comportamiento de NSMutableString, obtendrá errores de tiempo de ejecución porque el objeto real al que apunta la variable no es NSMutableString.