Ich habe in mehreren Büchern gelesen ... und online ... über unveränderliche und veränderbare Zeichenketten. Sie behaupten, dass "unveränderliche Strings" nicht geändert werden können. (Aber sie definieren niemals "Veränderung".)
Welche dieser NSStrings könnte ohne NSMutableString geändert werden?
Die Zeichenfolge enthält "Wels" ... und ich versuche später, es in "Katze" zu ändern. (Die gleichen Buchstaben, nur kürzer.)
Es enthält "Katze" ... und ich versuche, es zu "Wels" zu ändern. (Ähnliche starten ... aber nur länger gemacht.)
Ich ändere "cat" in "CAT". (Gleiche Buchstaben, aber nur der Fall hat sich geändert.)
Ich ändere "Katze" in "Hund". (Völlig andere Zeichenfolge, aber die gleiche Länge.)
Ich ändere "Katze" in "Hartriegel". (Völlig andere Zeichenfolge, aber länger.)
Die Antwort ist - keine. Unveränderlich bedeutet, dass es nicht in irgendetwas anders als die ursprüngliche Zeichenfolge geändert werden kann. Jedes Zeichen bleibt gleich, die Länge kann nicht geändert werden usw. Sobald es definiert ist, können Sie an dieser Zeichenfolge nichts ändern. Wenn Sie es länger oder kürzer machen oder eines der Zeichen ändern möchten, müssen Sie eine neue Zeichenfolge erstellen (oder verwenden Sie zunächst einen NSMutableString).
Wenn ich eine Variable deklariere:
%Vor% Was unveränderlich ist, ist das Objekt, auf das var
zeigt, nicht var
selbst.
Das bedeutet, dass ich an dem Objekt, auf das var
zeigt, nichts ändern kann, aber ich kann ändern, auf welches Objekt verwiesen wird.
Keine der von Ihnen erwähnten Operationen ist in var
erlaubt, aber Sie können var
einer anderen Zeichenfolge zuweisen:
Die Antwort ist - keine. Unveränderlich bedeutet, dass es nicht in irgendetwas anders als die ursprüngliche Zeichenfolge geändert werden kann. Jedes Zeichen bleibt gleich, die Länge kann nicht geändert werden usw. Sobald es definiert ist, können Sie an dieser Zeichenfolge nichts ändern. Wenn Sie es länger oder kürzer machen oder eines der Zeichen ändern möchten, müssen Sie eine neue Zeichenfolge erstellen (oder verwenden Sie zunächst einen NSMutableString).
NSString kann nicht bearbeitet werden. Jedes Mal, wenn Sie dem NSString-Objekt einen Zeichenfolgenwert zuweisen, wird das alte Zeichenfolgenobjekt verwaist und das neue Zeichenfolgenobjekt neu erstellt. Das ist eine teure Operation, wenn Sie mit großem Zeichenfolgenpuffer arbeiten. Wenn Sie mit großem Zeichenfolgenpuffer arbeiten, verwenden Sie NSMutableString für optimale Leistung. Dies ist vergleichbar mit String vs StringBuilder in .net.
Standardmäßig ist NSString, das in der Zielsprache C verwendet wird, unveränderlich. NSMutableString wird zum Deklarieren von & amp; Definieren Sie eine veränderbare Zeichenfolge. Nichts in einer unveränderlichen Zeichenkette kann geändert werden. Nicht die Länge, nicht die Charaktere, nichts.
Sie müssen auch "change" definieren:)
Wenn Sie einen NSString erstellen, erstellen Sie im Grunde ein Array von Zeichen, und Sie sagen dem Compiler, dass der Inhalt von Array niemals geändert wird. Der Teil "niemals ändern" ist der "unveränderliche" Teil; Die Daten, die die Zeichenfolge enthält, können niemals geändert werden.
Auf der anderen Seite können Sie mit einem NSMutableString die Daten, auf die es zeigt, ändern (daher ist es "änderbar"). Beachten Sie die 'appendString' -Methode, die für NSMutableString vorhanden ist; Dies nimmt tatsächlich Daten und schlägt sie auf das Ende der Zeichenfolge.
Zum Beispiel, wenn Sie hatten:
NSString * myString = @ "Katze"; myString = @ "Goldfisch";
Das würde gut funktionieren. Sie ändern niemals wirklich die Daten, die myString enthält; Sie sagen einfach, dass Sie auf ein neues Segment unveränderbarer Daten zeigen möchten.
Die einzige Zeit, in der Sie tatsächlich Probleme mit den Unterschieden zwischen veränderbaren und unveränderlichen Objekten bekommen würden, ist, wenn Sie versuchen, myString direkt zu ändern (z. B. append "s sind cool" oder etwas).
Mit anderen Worten, jede Klasse würde es Ihnen erlauben, eine beliebige Zeichenfolge in eine andere Zeichenfolge zu ändern, aber die Methoden, die Sie dafür verwenden, wären sehr unterschiedlich. Um beispielsweise "cat" mit einer veränderbaren Zeichenfolge in "CAT" umzuwandeln, können Sie jedes Zeichen durchlaufen und es einfach in Großbuchstaben schreiben (da Sie den Inhalt einer veränderbaren Zeichenfolge ändern können). Bei einer unveränderlichen Zeichenfolge müssten Sie andererseits die ursprüngliche Zeichenfolge an anderer Stelle kopieren, ändern und dann die Variable so umleiten, dass sie auf diesen neuen NSString verweist.
Die folgenden Links könnten nützlich sein: Ссылка Ссылка
Ich würde auch empfehlen, etwas zu googeln; Das ist eine Frage, die sich auf die Entwicklung im Allgemeinen bezieht, und es ist ein relativ wichtiger Begriff, den es zu erfassen gilt. Es wurde auch an anderer Stelle im Internet zu Tode diskutiert.
Eine unveränderliche Zeichenkette (oder irgendein unveränderliches Objekt) ist eine solche, die nach der Initialisierung überhaupt nicht geändert werden kann.
Hier ist der Vorteil der Verwendung unveränderlicher Strings im (Pseudo-) Pseudo-Code:
%Vor%Was hält nun? "Hallo Welt"? "Auf Wiedersehen Welt"? Nun, was hält b?
Wenn Strings änderbar sind, kann es "Goodbye World" enthalten. Dies kann sein, was Sie wollen. Es könnte nicht sein.
Bei der Unveränderlichkeit wird sehr deutlich, dass b immer noch auf die ursprüngliche Zeichenkette zeigt, da die replace-Methode die tatsächliche Zeichenkette nicht hätte ändern können, sondern stattdessen einen Verweis auf eine neue Zeichenkette zurückgegeben hat.
In diesem Beispiel sehen Sie möglicherweise keinen großen Nutzen. Wenn a und b jedoch in verschiedenen Teilen des Codes oder in verschiedenen Threads referenziert und verwendet werden, werden durch die Verwendung unveränderlicher Referenzen viele potenzielle Fehler beseitigt.
Ich habe in mehreren Büchern gelesen ... und online ... über unveränderliche und veränderbare Zeichenketten. Sie behaupten, dass "unveränderliche Strings" nicht geändert werden können. (Aber sie definieren niemals "Veränderung".)
Welche dieser NSStrings könnte ohne NSMutableString geändert werden?
Die Zeichenfolge enthält "Wels" ... und ich versuche später, es in "Katze" zu ändern. (Die gleichen Buchstaben, nur kürzer.)
Es enthält "Katze" ... und ich versuche, es zu "Wels" zu ändern. (Ähnliche starten ... aber nur länger gemacht.)
Ich ändere "cat" in "CAT". (Gleiche Buchstaben, aber nur der Fall hat sich geändert.)
Ich ändere "Katze" in "Hund". (Völlig andere Zeichenfolge, aber die gleiche Länge.)
Ich ändere "Katze" in "Hartriegel". (Völlig andere Zeichenfolge, aber länger.)
NSString kann nicht bearbeitet werden. Jedes Mal, wenn Sie dem NSString-Objekt einen Zeichenfolgenwert zuweisen, wird das alte Zeichenfolgenobjekt verwaist und das neue Zeichenfolgenobjekt neu erstellt. Das ist eine teure Operation, wenn Sie mit großem Zeichenfolgenpuffer arbeiten. Wenn Sie mit großem Zeichenfolgenpuffer arbeiten, verwenden Sie NSMutableString für optimale Leistung. Dies ist vergleichbar mit String vs StringBuilder in .net.
Sie müssen auch "change" definieren:)
Wenn Sie einen NSString erstellen, erstellen Sie im Grunde ein Array von Zeichen, und Sie sagen dem Compiler, dass der Inhalt von Array niemals geändert wird. Der Teil "niemals ändern" ist der "unveränderliche" Teil; Die Daten, die die Zeichenfolge enthält, können niemals geändert werden.
Auf der anderen Seite können Sie mit einem NSMutableString die Daten, auf die es zeigt, ändern (daher ist es "änderbar"). Beachten Sie die 'appendString' -Methode, die für NSMutableString vorhanden ist; Dies nimmt tatsächlich Daten und schlägt sie auf das Ende der Zeichenfolge.
Zum Beispiel, wenn Sie hatten:
NSString * myString = @ "Katze"; myString = @ "Goldfisch";
Das würde gut funktionieren. Sie ändern niemals wirklich die Daten, die myString enthält; Sie sagen einfach, dass Sie auf ein neues Segment unveränderbarer Daten zeigen möchten.
Die einzige Zeit, in der Sie tatsächlich Probleme mit den Unterschieden zwischen veränderbaren und unveränderlichen Objekten bekommen würden, ist, wenn Sie versuchen, myString direkt zu ändern (z. B. append "s sind cool" oder etwas).
Mit anderen Worten, jede Klasse würde es Ihnen erlauben, eine beliebige Zeichenfolge in eine andere Zeichenfolge zu ändern, aber die Methoden, die Sie dafür verwenden, wären sehr unterschiedlich. Um beispielsweise "cat" mit einer veränderbaren Zeichenfolge in "CAT" umzuwandeln, können Sie jedes Zeichen durchlaufen und es einfach in Großbuchstaben schreiben (da Sie den Inhalt einer veränderbaren Zeichenfolge ändern können). Bei einer unveränderlichen Zeichenfolge müssten Sie andererseits die ursprüngliche Zeichenfolge an anderer Stelle kopieren, ändern und dann die Variable so umleiten, dass sie auf diesen neuen NSString verweist.
Die folgenden Links könnten nützlich sein: Ссылка Ссылка
Ich würde auch empfehlen, etwas zu googeln; Das ist eine Frage, die sich auf die Entwicklung im Allgemeinen bezieht, und es ist ein relativ wichtiger Begriff, den es zu erfassen gilt. Es wurde auch an anderer Stelle im Internet zu Tode diskutiert.
Eine unveränderliche Zeichenkette (oder irgendein unveränderliches Objekt) ist eine solche, die nach der Initialisierung überhaupt nicht geändert werden kann.
Hier ist der Vorteil der Verwendung unveränderlicher Strings im (Pseudo-) Pseudo-Code:
%Vor%Was hält nun? "Hallo Welt"? "Auf Wiedersehen Welt"? Nun, was hält b?
Wenn Strings änderbar sind, kann es "Goodbye World" enthalten. Dies kann sein, was Sie wollen. Es könnte nicht sein.
Bei der Unveränderlichkeit wird sehr deutlich, dass b immer noch auf die ursprüngliche Zeichenkette zeigt, da die replace-Methode die tatsächliche Zeichenkette nicht hätte ändern können, sondern stattdessen einen Verweis auf eine neue Zeichenkette zurückgegeben hat.
In diesem Beispiel sehen Sie möglicherweise keinen großen Nutzen. Wenn a und b jedoch in verschiedenen Teilen des Codes oder in verschiedenen Threads referenziert und verwendet werden, werden durch die Verwendung unveränderlicher Referenzen viele potenzielle Fehler beseitigt.
Standardmäßig ist NSString, das in der Zielsprache C verwendet wird, unveränderlich. NSMutableString wird zum Deklarieren von & amp; Definieren Sie eine veränderbare Zeichenfolge. Nichts in einer unveränderlichen Zeichenkette kann geändert werden. Nicht die Länge, nicht die Charaktere, nichts.
Tags und Links objective-c cocoa cocoa-touch immutability mutable