Esiste una funzione incorporata che mi consenta di copiare in profondità un NSMutableArray
?
Mi sono guardato intorno, alcune persone dicono che [aMutableArray copyWithZone:nil]
funziona come copia profonda. Ma ho provato e sembra essere una copia superficiale.
In questo momento sto facendo manualmente la copia con un for
ciclo:
//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];
}
}
}
}
ma vorrei una soluzione più pulita e concisa.
-copy
raccolte immutabili è cambiato tra Mac OS X 10.4 e 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (scorri verso il basso fino a "Collezioni immutabili e comportamento di copia")
copy
, cosa deve essere inserito nella "copia completa"? Se l'elemento è un'altra raccolta, in copy
realtà non produce una copia (della stessa classe). Quindi penso che sia perfettamente valido discutere sul tipo di copia desiderata nel caso specifico.
NSCopying
/ -copy
, non è copiabile, quindi non dovresti mai provare a farne una copia, perché non è una capacità per cui è stato progettato. In termini di implementazione di Cocoa, gli oggetti non copiabili hanno spesso uno stato backend C a cui sono legati, quindi l'hacking di una copia diretta dell'oggetto potrebbe portare a condizioni di gara o peggio. Quindi, per rispondere "cosa deve essere inserito nella 'copia completa'" - A ref. L'unica cosa che puoi mettere ovunque quando hai un non NSCopying
oggetto.