¿Hay alguna función incorporada que me permita realizar una copia profunda NSMutableArray
?
Miré a mi alrededor, algunas personas dicen que [aMutableArray copyWithZone:nil]
funciona como una copia profunda. Pero lo intenté y parece ser una copia superficial.
En este momento estoy haciendo la copia manualmente con un for
bucle:
//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];
}
}
}
}
pero me gustaría una solución más limpia y concisa.
-copy
colecciones inmutables cambió entre Mac OS X 10.4 y 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (desplácese hacia abajo hasta "Colecciones inmutables y comportamiento de copia")
copy
, ¿qué se incluirá en la "copia profunda"? Si el elemento es otra colección, en copy
realidad no produce una copia (de la misma clase). Así que creo que es perfectamente válido discutir sobre el tipo de copia que se desea en el caso específico.
NSCopying
/ -copy
, entonces no se puede copiar, por lo que nunca debe intentar hacer una copia, porque esa no es una capacidad para la que fue diseñado. En términos de la implementación de Cocoa, los objetos no copiables a menudo tienen algún estado de backend C al que están vinculados, por lo que piratear una copia directa del objeto podría generar condiciones de carrera o algo peor. Entonces, para responder “lo que se pondrá en la 'copia profunda'” - Se retuvo una ref. Lo único que puede poner en cualquier lugar cuando tiene un no NSCopying
objeto.