Pregunta

Pensé que una variable en object-c es solo una referencia a un objeto en algún lugar de la memoria. Por lo tanto, para mi entendimiento, el resultado debe haber sido "uno", porque al final asigno la dirección de memoria del objeto de str1 a str2, y anteriormente tuve que asignar la dirección de memoria de str2 a probar.

NSString *str1 = [NSString stringWithCString:"one"];
NSString *str2 = [NSString stringWithCString:"two"];

test = str2; // test is an instance variable. I use no getter/setter here! just for testing!
str2 = str1;
NSLog(test); // = "two" ??
¿Fue útil?

Solución

Así es como funcionan los punteros. El resultado que ves es normal y correcto.

Enumeraremos todas las variables y las cadenas a las que apuntan en la memoria a medida que se declaran:

str1 -> "One"
str2 -> "Two"

Luego, ejecuta algunas instrucciones de asignación:

test = str2;

Esto asigna el valor del puntero str2 a test . Así que los punteros son

str1 -> "One"
str2 -> "Two"
test -> "Two"

entonces

str2 = str1;

Asigna el valor del puntero str1 a str2 . Ahora los punteros son

str1 -> "One"
str2 -> "One"
test -> "Two"

Luego imprime prueba , que apunta a lo que str2 apuntaba originalmente, que es " Dos " ;.

Creo que piensas que ya asignaste str2 al valor de str1 , y test al valor de str2 , que el valor de str1 de alguna manera cae en cascada en test . Este no es el caso. Una vez que se asigna el valor de test , se pierde la información sobre el origen del valor. Si desea que el valor de test sea el mismo que el de str1 , debe invertir el orden de sus operaciones de asignación:

str2 = str1;
test = str2;

Otros consejos

Tienes esto:

test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??

Ahora, supongamos que todas esas variables fueron ints.

En la primera línea, la variable test se establece en el valor de la variable str2 . En la segunda línea, la variable str2 se establece en el valor de la variable str1 . En la tercera línea, imprimimos el valor de test , y de hecho es el valor que str2 era cuando asignamos str2 a la prueba. Realmente no importa en absoluto que posteriormente asignamos a str2 un valor diferente.

Está bien, pero las variables son realmente punteros, dices, no ints.

No importa: piense que un puntero es solo un número, la dirección de algún lugar en la memoria. Y pasar eso a NSLog hace que NSLog no imprima el valor del puntero, sino el valor de lo que apunta el puntero, que es una matriz de caracteres.

Una variable es un contenedor. La tarea toma lo que está en el lado derecho y lo pone también en lo que está en el lado izquierdo. En otras palabras, copia el valor de una variable a la otra; en este caso, esos valores son punteros (direcciones de memoria).

Así que esto es lo que hiciste:

  1. Tome la dirección que está en la variable str2 y ponga la misma dirección en la variable test .
  2. Tome la dirección que está en la variable str1 y coloque la misma dirección en la variable str2 .

El paso 2 no afecta la variable test ; su única asignación a esa variable fue en el paso 1.

Importante: no estás copiando a qué se debe la dirección; estás copiando la dirección en sí misma . Todavía hay solo un & # 8220; dos & # 8221; cadena, pero entre los pasos 1 y 2, la dirección de ese objeto se encuentra tanto en str2 como en test . Luego, en el paso 2, reemplaza la dirección en str2 con la dirección de & # 8220; one & # 8221; string, que también existe en str1 , dejando a test como la única variable que aún tiene la dirección de & # 8220; two & # 8221; cadena.

Por cierto, stringWithCString: está en desuso. Utilice stringWithUTF8String: o stringWithCString: encoding: en su lugar.

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