Frage

Der folgende Code kompiliert und ausgeführt, sondern nach allen iPhone-Entwicklung Büchern und Apple-Dokumentation es nicht soll! Kann mir jemand bitte erklären, wie kommt es unveränderlich NSString ihre Werte ändern können, nachdem sie eingestellt wurde? Ich dachte, ich hätte NSMuttableString verwenden Zusammenhang mit dem gleichen String-Variable zu ändern? Ich bin mit SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
War es hilfreich?

Lösung

Vielleicht ist das folgende Beispiel auf den Antworten von Mark und Niels hinzufügen und helfen, Dinge zu klären.

Immutable Strings

// 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);

Mutable Strings

// 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);

Beachten Sie, wenn Sie die unveränderliche NSString-Klasse verwenden, dass der einzige Weg zu „ersetzen“ ist eine Zeichenfolge eine neue Zeichenfolge zu erstellen und Ihre Variable „str2“ aktualisieren, um es zu zeigen. Dies ist jedoch nicht beeinflusst, was „str1“ zeigt auf, so dass es immer noch die ursprüngliche Zeichenfolge verweisen wird.

Im NSMutableString Beispiel haben wir nicht schaffen eine zweite Zeichenfolge, sondern verändern (mutieren) den Inhalt des bestehenden „Hallo Welt“ String. Da beide Variablen auf demselben String-Objekt zeigen weiterhin, werden sie den neuen Wert in dem Aufruf von NSLog berichten beide.

Es ist wichtig, zwischen einer Zeigervariable und dem eigentlichen Objekt verweist er auf unterscheiden. Ein NSString Objekt ist unveränderlich, aber das hindert Sie nicht aus, den Wert einer Variablen zu ändern, die auf eine Zeichenfolge verweist.

Der Datentyp „NSString *“ ist ein Zeiger auf ein NSString Objekt, nicht das Objekt selbst. Wenn Sie einen Haltepunkt an einen der NSLog Aussagen im XCode Debugger gesetzt, können Sie gerne den Rohwert jeden Variablen zu überprüfen, dies zu klären.

Andere Tipps

Sie mutieren nicht die Zeichenfolge, die Sie Neuzuweisung nur die Variable Test auf eine andere Zeichenfolge zu verweisen. Die ursprüngliche Zeichenfolge wird nicht geändert.

TEST und TEST2 sind zwei verschiedene Strings durch den * Test Zeiger zeigt.

Sie ändern nicht den Inhalt des explizit zugeordnet NSString-Objekts aus der ersten Zeile des Codes, sondern zeigen * Test auf ein anderes Objekt.

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