Pregunta

El siguiente código se compila y ejecuta, PERO de acuerdo con todos los libros de desarrollo de iPhone y la documentación de Apple, ¡no debería! ¿Puede alguien, por favor, explicarme por qué NSString inmutable permite cambiar sus valores después de que se haya establecido? ¿Pensé que tenía que usar NSMuttableString para cambiar el contexto de la misma variable de cadena? Estoy usando SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
¿Fue útil?

Solución

Tal vez el siguiente ejemplo agregue las respuestas de Mark y Niels y ayude a aclarar las cosas.

Cuerdas inmutables

// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;

// "Replace" the second string
str2 = @"Hello ikilimnik";

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Cadenas mutables

// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;

// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Cuando use la clase NSString inmutable, observe que la única forma de " reemplazar " una cadena es crear una nueva cadena y actualizar su variable " str2 " para señalarlo. Sin embargo, esto no afecta a lo que " str1 " está apuntando a, por lo que aún hará referencia a la cadena original.

En el ejemplo de NSMutableString, no creamos una segunda cadena, sino que alteramos (mutamos) el contenido del " Hello World " existente; cuerda. Dado que ambas variables continúan apuntando al mismo objeto de cadena, ambas reportarán el nuevo valor en la llamada a NSLog.

Es importante diferenciar entre una variable de puntero y el objeto real al que apunta. Un objeto NSString es inmutable, pero eso no le impide cambiar el valor de una variable que apunta a una cadena.

El tipo de datos " NSString * " es un puntero a un objeto NSString, no al objeto en sí. Si establece un punto de ruptura en cualquiera de las sentencias NSLog dentro del depurador XCode, le recomendamos que verifique el valor bruto de cada variable para aclarar esto.

Otros consejos

No estás mutando la cadena, solo estás reasignando la prueba de la variable para que apunte a una cadena diferente. La cadena original no ha sido modificada.

TEST y TEST2 son dos cadenas diferentes a las que apunta el * puntero de prueba.

No está cambiando el contenido del objeto NSString asignado explícitamente desde la primera línea de código, sino que apunta * prueba a otro objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top