Warum verhalten sich die Variablen so seltsam?
-
03-07-2019 - |
Frage
Ich dachte, eine Variable in Objective-C ist nur ein Verweis auf ein Objekt irgendwo im Speicher. Also für mein Verständnis muss das Ergebnis gewesen sein „eins“, weil am Ende i der Speicheradresse von str1 zu str2 Objekt zuweisen, und vorher hatte ich assignend die Speicheradresse von str2 zu testen.
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" ??
Lösung
Dies ist, wie Zeiger Arbeit. Das Ergebnis, das Sie sehen, ist normal und richtig.
Lassen Sie uns alle Ihre Variablen auflisten und welche Saiten sie in Speicher zeigen, wie sie deklariert werden:
str1 -> "One"
str2 -> "Two"
Dann führen Sie einige Zuweisungsbefehle:
test = str2;
Dies weist den Wert des Zeigers str2
test
. So sind die Zeiger sind
str1 -> "One"
str2 -> "Two"
test -> "Two"
Dann
str2 = str1;
Weist den Wert des Zeigers str1
str2
. Nun sind die Zeiger sind
str1 -> "One"
str2 -> "One"
test -> "Two"
Dann drucken Sie test
, die zu dem, was str2
zeigt ursprünglich zeigte auf, was ist "Two".
Ich glaube, Sie denken, dass da Sie str2
auf den Wert von str1
und test
auf den Wert von str2
, dass der Wert von str1
irgendwie Kaskaden in test
zugeordnet. Das ist nicht der Fall. Sobald Wert test
zugeordnet ist, in Bezug auf die Information, wo der Wert herkommt verloren. Wenn Sie test
den Wert wollen die gleiche wie str1
der sein, müssen Sie Sie die Reihenfolge der Zuweisungsoperationen umgekehrt:
str2 = str1;
test = str2;
Andere Tipps
Sie haben diese:
test = str2; // test is an instance variable.testing!
str2 = str1;
NSLog(test); // = "two" ??
Nun wollen wir so tun, als all diese Variablen waren Ints.
In der ersten Zeile, variable test
auf den Wert der Variablen str2
gesetzt.
In der zweiten Zeile wird die Variable str2
auf den Wert der Variable str1
eingestellt.
In der dritten Zeile, drucken wir den Wert von test
aus, und es ist in der Tat der Wert, den str2
war, als wir str2
zu testen zugeordnet.
Es spielt wirklich keine Rolle überhaupt, dass wir einen anderen Wert anschließend zugewiesen str2
.
Ok, aber die Variablen sind wirklich Zeiger, Sie sagen, nicht Ints.
Egal: Man denke an einem Zeiger als nur eine Nummer, die Adresse irgendwo im Speicher. Und nebenbei, dass zu NSLog macht NSLog Druck nicht der Wert des Zeigers, aber der Wert dessen, was der Zeiger auf, die ein Array von char ist.
Eine Variable ist ein Container. Die Zuordnung erfolgt, was auf der rechten Seite ist und legt es auch in unabhängig von den auf der linken Seite. Mit anderen Worten, es kopiert den Wert von einer Variablen zu dem anderen; in diesem Fall sind die Werte, Zeiger (Speicheradressen).
So, hier ist was Sie getan haben:
- Nehmen Sie die Adresse, die in der
str2
Variable ist und setzen die gleiche Adresse in dertest
Variable. - Nehmen Sie die Adresse, die in der
str1
Variable ist und setzen die gleiche Adresse in derstr2
Variable.
Schritt 2 nicht die test
Variable beeinflussen; Ihre einzige Zuordnung zu diesen Variablen war in Schritt 1.
Wichtig: Sie kopieren nicht was ist bei die Adresse; Sie kopieren die Adresse selbst . Es gibt nach wie vor nur eine „zwei“ string, aber zwischen den Schritten 1 und 2, die Adresse des Objekts ist sowohl in str2
und test
. Dann wird in Schritt 2, ersetzen Sie die Adresse in str2
mit der Adresse des „Eins“ Zeichenfolge, die auch in str1
existiert, test
als einzigen Variable zu verlassen, die immer noch die Adresse des „zwei“ string hält.
BTW, stringWithCString:
ist veraltet. Verwenden Sie stringWithUTF8String:
oder stringWithCString:encoding:
statt.