Ich verstehe, dass Sie normalerweise copy für NSStrings verwenden, damit Ihre Eigenschaft den gleichen Wert behält wie bei der Zuweisung, selbst wenn versucht wird, sie an einem anderen Ort zu ändern.
Aber ich habe es schwer, dieses Konzept vollständig zu verstehen. Gilt das nicht für praktisch jede Art von Objekt (nicht nur NSStrings)?
Also meine Frage ist, "Welche Art von Eigenschaften sollte ich als 'Kopie' einstellen, und warum?"
Objekte, bei denen es sich um einfache Datenbits handelt, z. B. Zeichenfolgen, die keine Referenzen auf eine Tonne anderer Objekte in Ihrer Anwendung haben, eignen sich hervorragend zum Kopieren.
Nun können Sie natürlich Dinge wie Saiten beibehalten. Das wird gut funktionieren. Aber was wäre, wenn Sie stattdessen eine veränderbare Zeichenkette hätten und diese geändert hätten? Jetzt wird jedes andere Objekt, das einen Verweis auf diese Zeichenfolge hatte, diese Änderung sehen. Dies ist möglicherweise nicht das, was Sie wollen. Dies ist einer der Gründe, warum das Kopieren "einfacher" ist, da Änderungen an diesen Daten nur auf diesen Code beschränkt sind.
Auf der anderen Seite nehmen wir an, Sie haben eine Instanz einer Klasse, die Sie für Ihre App geschrieben haben. Es hat Verweise auf andere Objekte in Ihrer App, es hat eine Menge eigener Strings oder anderer Werte und es ist ein komplexes Biest. Das Kopieren dieses Objekts ist möglicherweise keine gute Idee. Wenn Sie dieses Objekt ändern, möchten Sie wahrscheinlich, dass die Änderungen für jedes Objekt propagiert werden, das eine Referenz enthält. Und selbst wenn Sie es kopiert haben, benötigen Sie eine flache Kopie (eine neue Instanz, aber es bezieht sich auf dieselben Objekte) oder eine tiefe Kopie (eine neue Instanz, die neue Kopien von jedem ivar enthält)? Und das fragliche Objekt unterstützt möglicherweise nicht einmal <NSCopying>
, was bedeutet, dass es technisch überhaupt nicht kopiert werden kann.
Also zusammenfassend:
copy
: Objekte, die kleine, atomare Datenbits ohne interne Verweise auf andere Objekte sind. retain
: Fast jede andere Art von Objekt. Client-Code kann ein NSMutableString-Objekt einer NSString-Eigenschaft zuweisen. Wenn die Eigenschaft als stark oder als ein anderes Nichtkopierattribut definiert wurde, ändert der Wert der Eigenschaft nun den Wert der Eigenschaft, wenn der Client später die änderbare Zeichenfolge ändert. Durch Festlegen der zu kopierenden Eigenschaft wird eine Kopie des Zeichenfolgenwerts erstellt, um sicherzustellen, dass der Wert nicht hinter Ihrem Rücken geändert werden kann.
Sie sollten also grundsätzlich kopieren, wenn die Eigenschaft für einen Typ ist, der ein veränderliches Gegenstück hat, und Sie möchten sicherstellen, dass der Wert sich bei Ihnen nicht ändert.
Tags und Links objective-c ios ios5 setter