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" ??
War es hilfreich?

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:

  1. Nehmen Sie die Adresse, die in der str2 Variable ist und setzen die gleiche Adresse in der test Variable.
  2. Nehmen Sie die Adresse, die in der str1 Variable ist und setzen die gleiche Adresse in der str2 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top