Ich muss ein benutzerdefiniertes Objekt mit eigenen Objekten tief kopieren. Ich habe herumgelesen und bin etwas verwirrt darüber, wie man NSCopying erbt und wie man NSCopyObject verwendet.
objective-c
copy
ben
quelle
quelle
Antworten:
Wie immer bei Referenztypen gibt es zwei Begriffe von "Kopie". Ich bin sicher, Sie kennen sie, aber der Vollständigkeit halber.
Du willst Letzteres. Wenn dies eines Ihrer eigenen Objekte ist, müssen Sie einfach das Protokoll NSCopying übernehmen und implementieren - (id) copyWithZone: (NSZone *) zone. Sie können tun, was Sie wollen. Die Idee ist jedoch, dass Sie eine echte Kopie von sich selbst erstellen und diese zurückgeben. Sie rufen copyWithZone für alle Ihre Felder auf, um eine tiefe Kopie zu erstellen. Ein einfaches Beispiel ist
quelle
autorelease
es nicht, oder vermisse ich hier etwas?copyWithZone:
erfüllt diese Kriterien, daher muss ein Objekt mit einer Anzahl von +1 zurückgegeben werden.alloc
anstattallocWithZone:
seit die Zone übergeben wurde?allocWithZone
.copy
,mutableCopy
undcopyWithZone
verknüpft, um in eine der Antworten, ist hier.Apple-Dokumentation sagt
zur vorhandenen Antwort hinzufügen
quelle
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
. Ich denke, dies ist nur erforderlich, wenn wir von einer anderen benutzerdefinierten Klasse erben, die implementiertcopyWithZone
Ich kenne den Unterschied zwischen diesem und meinem Code nicht, aber ich habe Probleme mit dieser Lösung. Deshalb habe ich ein bisschen mehr gelesen und festgestellt, dass wir das Objekt festlegen müssen, bevor wir es zurückgeben. Ich meine so etwas wie:
Ich habe diese Antwort hinzugefügt, weil ich viele Probleme mit diesem Problem habe und keine Ahnung habe, warum es passiert. Ich kenne den Unterschied nicht, aber es funktioniert für mich und vielleicht kann es auch für andere nützlich sein :)
quelle
Ich denke, dass diese Zeile einen Speicherverlust verursacht, weil Sie auf die
obj
Eigenschaft through zugreifen, die (ich nehme an) als deklariert istretain
. Die Anzahl der Einbehaltungen wird also durch das Eigentum und erhöhtcopyWithZone
.Ich glaube es sollte sein:
oder:
quelle
Es gibt auch die Verwendung des Operators -> zum Kopieren. Beispielsweise:
Die Argumentation hier ist, dass das resultierende kopierte Objekt den Zustand des ursprünglichen Objekts widerspiegeln sollte. Das "." Der Bediener könnte Nebenwirkungen einführen, da dieser Getter aufruft, die wiederum Logik enthalten können.
quelle