Best Practice beim Implementieren von copyWithZone:
Ich versuche zu klären ein paar Dinge im Kopf, über die Umsetzung copyWithZone:
kann jeder Kommentar über die folgenden ...
//001: Crime is a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [[[self class] allocWithZone:zone] init];
if(newCrime) {
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
}
return newCrime;
}
//002: Crime is not a subclass of NSObject.
- (id)copyWithZone:(NSZone *)zone {
Crime *newCrime = [super copyWithZone:zone];
[newCrime setMonth:[self month]];
[newCrime setCategory:[self category]];
[newCrime setCoordinate:[self coordinate]];
[newCrime setLocationName:[self locationName]];
[newCrime setTitle:[self title]];
[newCrime setSubtitle:[self subtitle]];
return newCrime;
}
In 001:
- Ist es am besten zu schreiben, den Namen der Klasse direkt
[[Crime allocWithZone:zone] init]
oder sollte ich[[[self Class] allocWithZone:zone] init]
? - Ist es in Ordnung
[self month]
für das kopieren des iVars oder sollte ich auf den iVars direkt, d.h._month
?
InformationsquelleAutor der Frage fuzzygoat | 2012-03-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie immer
[[self class] allocWithZone:zone]
um sicherzustellen, dass Sie erstellen eine Kopie mit der entsprechenden Klasse. Das Beispiel, das Sie geben, 002 zeigt genau, warum: Unterklassen rufen[super copyWithZone:zone]
und erwarten eine Instanz der entsprechenden Klasse, nicht eine Instanz der Superklasse.Ich auf die ivars direkt, so dass ich nicht brauchen, um sorgen über irgendwelche Nebenwirkungen, die ich hinzufügen könnte, um die Eigenschaft setter (z.B. Benachrichtigungen generieren) später auf. Halten Sie im Verstand, Unterklassen sind kostenlos zu überschreiben-Methode. In Ihrem Beispiel, Sie senden zwei extra-Nachrichten pro ivar. Ich würde implementieren Sie wie folgt:
Code:
Natürlich, ob Sie kopieren die ivars, behalten Sie, oder teilen Sie Sie sollten wiederspiegeln, was der setter tun.
InformationsquelleAutor der Antwort Tony
Den Standard-copy-Verhalten von
copyWithZone:
Methode mit dem SDK erstellte Objekte bleibt "flache Kopie". Das heißt, wenn Sie rufencopyWithZone:
aufNSString
Objekt, wird es erstellt eine flache Kopie, aber keine Tiefe Kopie. Unterschied zwischen shallow und deep copy :Wird eine flache Kopie eines Objekts wird lediglich eine Kopie der Referenzen auf die Objekte des ursprünglichen Arrays und legen Sie Sie in das neue array.
Einer tiefen Kopie wird eigentlich kopieren der einzelnen Objekte in das Objekt. Dies geschieht durch senden jedes einzelne Objekt die
copyWithZone:
Nachricht in Ihrer benutzerdefinierten Klasse Methode.INSHORT : flache Kopie rufen Sie
retain
oderstrong
auf alle Instanz-Variablen. Um tief kopieren Sie rufencopyWithZone:
auf alle Instanz-Variablen in einer benutzerdefinierten KlassecopyWithZone:
Umsetzung. Nun, es ist Ihre Wahl zu wählen.InformationsquelleAutor der Antwort Trident
Dies ist mein Modell.
InformationsquelleAutor der Antwort ylgwhyh
Wie über dieses, umzusetzen Tiefe Kopie:
InformationsquelleAutor der Antwort N.Lee