Überschreiben Kopieren oder CopyWithZone: oder beides?

8

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.

    
Crystal 14.02.2012, 16:18
quelle

2 Antworten

14

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.

    
Costique 14.02.2012 18:02
quelle
0

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.

    
Rivera 15.10.2015 14:28
quelle

Tags und Links