Das letzte Wort auf NSStrings: Veränderbar und Unveränderlich

8

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.)

    
Donna 25.05.2009, 05:02
quelle

6 Antworten

20

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).

    
Marc Novakowski 25.05.2009 05:11
quelle
11
___ answer905495 ​​___

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:

%Vor%     
___ answer905411 ___

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).

    
___ answer8713930 ___

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.

    
___ answer17570443 ___

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.

    
___ answer905466 ___

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.

    
___ qstnhdr ___ Das letzte Wort auf NSStrings: Veränderbar und Unveränderlich ___ answer905585 ___

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.

    
___ qstntxt ___

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.)

    
___ tag123cocoa ___ Cocoa ist Apples Entwicklungsumgebung für MacOS, bestehend aus Foundation, Application Kit und Core Data. Verwenden Sie den "Kakao-Touch" -Tag für iOS-Fragen. ___ tag123immutability ___ Unveränderbarkeit ist die Unfähigkeit, Daten zu ändern, nachdem sie erstellt wurden. Änderungen werden stattdessen durch Kopieren der Daten vorgenommen. Eine Eigenschaft unveränderlicher Daten ist, dass sie * referenziell transparent * ist. ___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die zugehörigen Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ tag123cocoatouch ___ Die Cocoa Touch-Frameworks, die iOS-Apps steuern, teilen viele bewährte Muster, die auf dem Mac gefunden wurden, wurden jedoch mit besonderem Fokus auf Touch-basierte Oberflächen und Optimierung erstellt. ___ tag123mutable ___ Ein veränderbares Element kann nach der Erstellung geändert werden. ___
mouviciel 25.05.2009 05:55
quelle
3

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.

    
user1128033 03.01.2012 14:42
quelle
2

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.

    
user43922 25.05.2009 05:42
quelle
2

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.

    
Steve McLeod 25.05.2009 06:29
quelle
1

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.

    
user2560622 10.07.2013 12:17
quelle