Gibt es eine eingebaute Funktion, mit der ich eine tief kopieren kann NSMutableArray
?
Ich habe mich umgesehen, manche Leute sagen, es [aMutableArray copyWithZone:nil]
funktioniert als tiefe Kopie. Aber ich habe es versucht und es scheint eine flache Kopie zu sein.
Im Moment mache ich das Kopieren manuell mit einer for
Schleife:
//deep copy a 9*9 mutable array to a passed-in reference array
-deepMuCopy : (NSMutableArray*) array
toNewArray : (NSMutableArray*) arrayNew {
[arrayNew removeAllObjects];//ensure it's clean
for (int y = 0; y<9; y++) {
[arrayNew addObject:[NSMutableArray new]];
for (int x = 0; x<9; x++) {
[[arrayNew objectAtIndex:y] addObject:[NSMutableArray new]];
NSMutableArray *aDomain = [[array objectAtIndex:y] objectAtIndex:x];
for (int i = 0; i<[aDomain count]; i++) {
//copy object by object
NSNumber* n = [NSNumber numberWithInt:[[aDomain objectAtIndex:i] intValue]];
[[[arrayNew objectAtIndex:y] objectAtIndex:x] addObject:n];
}
}
}
}
aber ich hätte gerne eine sauberere, prägnantere Lösung.
-copy
unveränderlichen Sammlungen zwischen Mac OS X 10.4 und 10.5 geändert hat: developer.apple.com/library/mac/releasenotes/Cocoa/… (scrollen Sie nach unten zu "Unveränderliche Sammlungen und Kopierverhalten")
copy
, was soll in die "tiefe Kopie" eingefügt werden? Wenn das Element eine andere Sammlung ist, copy
wird tatsächlich keine Kopie (derselben Klasse) ausgegeben. Ich denke, es ist absolut richtig, über die Art der Kopie zu streiten, die im konkreten Fall gewünscht wird.
NSCopying
/ nicht implementiert -copy
, kann es nicht kopiert werden. Sie sollten daher niemals versuchen, eine Kopie davon zu erstellen , da dies keine Funktion ist, für die es entwickelt wurde. In Bezug auf die Implementierung von Cocoa haben nicht kopierbare Objekte häufig einen C-Backend-Status, an den sie gebunden sind. Das Hacken einer direkten Kopie des Objekts kann daher zu Rennbedingungen oder schlechteren Bedingungen führen. Um zu antworten: "Was soll in die" tiefe Kopie "gelegt werden ?" Das einzige, was Sie irgendwo platzieren können, wenn Sie ein Nicht- NSCopying
Objekt haben.