11 Stimmen

NSString-Kopie wird nicht kopiert?

  NSString *myString = @"sample string";
  NSString *newString = [myString copy];

Wenn ich nach diesen beiden Zeilen einen Haltepunkt setze, ist der Zeiger für myString derselbe wie der Zeiger für newString.

WTF? Sollte NSString copy nicht einen Zeiger auf ein neues Objekt zurückgeben? Oder übersehe ich etwas Grundlegendes darüber, wie copy funktionieren soll?

0 Stimmen

Ich kenne die Antwort nicht, aber wenn Sie myString ändern, dann haben beide unterschiedliche Adressen... bis der Inhalt der Zeichenfolge gleich ist, ist es in der gleichen Adresse...

2 Stimmen

Erstens: Sie haben nicht copy, sondern stringWithString: aufgerufen. Zweitens: Da Strings unveränderlich sind, nehmen der Compiler und die Laufzeitumgebung Optimierungen vor. Normalerweise werden unveränderliche Objekte mit einer zusätzlichen Anzahl von Referenzen zurückgegeben, anstatt ein neues Objekt zu erstellen.

0 Stimmen

Die Schönheit des Kakaos - keine Kopien von Daten erstellen, wenn sie nicht benötigt werden ...

12voto

stefanB Punkte 72857

Seit NSString es nicht veränderbar es könnte nur intern zu einem Anstieg kommen ref count und damit fertig sein.

Wenn Sie release einer dieser NSStrings könnte er einfach dekrementieren ref count - Standard-Speicherverwaltung.

Sehen Sie darin irgendwelche Probleme?

8voto

kizzx2 Punkte 18127

Denken Sie einmal darüber nach: NSMutableString ist eine Unterklasse von NSString . Wenn Ihre Immobilie als Eigentum deklariert ist NSString Sie erwarten nicht, dass sich das ändert.

Bedenken Sie, wenn Sie retain und jemand gab Ihnen eine NSMutableString und sie dann später ändern, wird Ihre Klasse kaputt gehen.

Sie mögen jedoch denken, dass immer copy tung ist langsam. Also NSString 's copy ruft einfach retain . NSMutableString 's copy erstellt eine aktuelle Kopie.

Es ist in der Regel besser, einen Spucknapf zu geben NSString * weil die Leute sie dann nicht ständig kopieren müssen.

2voto

R00We Punkte 1871

Sie können eine neue Variable wie im Beispiel zuweisen

NSString *anotherString = [[NSString alloc] initWithString:originalString];

1voto

SmallTitan Punkte 21

Es ist besser, den von einer Methode zurückgegebenen String-Wert zu kopieren, da es sich bei dem zurückgegebenen Wert möglicherweise um ein veränderbares String-Objekt handelt und dieser Wert in einem anderen Thread geändert werden kann, nachdem er von dieser Methode zurückgegeben wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X