Ich bin verwirrt, wenn ich mir die Dokumentation von Apple anschaue und Cocoa-Designmuster lese. In der Apple-Dokumentation für copyWithZone:
lautet es:
Diese Methode existiert, so dass Klassenobjekte in Situationen verwendet werden können, in denen Sie benötigen ein Objekt, das dem NSCopying-Protokoll entspricht. Zum Zum Beispiel können Sie mit dieser Methode ein Klassenobjekt als Schlüssel für ein NSDictionary-Objekt. Sie sollten diese Methode nicht überschreiben.
Für copy
lautet es:
Dies ist eine bequeme Methode für Klassen, die das NSCopying anwenden Protokoll. Eine Ausnahme wird ausgelöst, wenn keine Implementierung für copyWithZone:.
NSObject unterstützt das NSCopying-Protokoll nicht selbst. Unterklassen muss das Protokoll unterstützen und die Methode copyWithZone: implementieren. EIN Die Unterklassenversion der copyWithZone: Methode sollte die Nachricht senden zuerst, um seine Implementierung zu integrieren, es sei denn, die Unterklasse steigt direkt von NSObject ab.
In den Beispielen in Cocoa Design Patterns überschreiben sie copyWithZone:
und mutableCopyWithZone:
, überschreiben aber nicht copy
, wenn sie dem Protokoll NSCopying
entsprechen. Soll ich meine benutzerdefinierte Unterklasse in NSDictionary
als Schlüssel verwenden?
Oder überschreibe ich copy
?
Ebenso, wenn ich [myClass copy]
mache, ruft das copyWithZone:
oder copy
für meine benutzerdefinierte Unterklasse auf? Danke.
Es ist ziemlich einfach: Die Standardimplementierung von copy
ruft nur copyWithZone:
mit einem NULL-Argument auf. Sie sollten also immer copyWithZone:
implementieren. Da auf iOS jedoch keine Speicherzonen verwendet werden (soweit ich weiß), sollten Sie die Zone ignorieren, ohne irgendwelche Annahmen zu machen.
Bearbeiten: Um das zu verdeutlichen, können Sie auch copy
implementieren, aber Sie müssen copyWithZone:
implementieren, weil Sie nie wissen, welche von ihnen NSDictionary
aufrufen wird in iOS 6.
Sie können weiterhin die Superklassen-Convenience-Methode verwenden, da sie in jedem Fall nur copyWithZone:
aufruft.
Dies sollte für jede Komfortmethode gelten. Sie sollten herausfinden, welche Methode sie aufrufen und diese stattdessen überschreiben.
Wie oben erwähnt, werden Zonen überhaupt nicht mehr verwendet, aber die Methode verfügt immer noch über diesen Parameter aus Gründen der Kompatibilität und aus historischen Gründen.