Existe alguma função incorporada que me permite copiar em profundidade um NSMutableArray
?
Olhei em volta, algumas pessoas dizem que [aMutableArray copyWithZone:nil]
funciona como cópia profunda. Mas tentei e parece ser uma cópia superficial.
No momento, estou fazendo a cópia manualmente com um for
loop:
//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];
}
}
}
}
mas gostaria de uma solução mais limpa e sucinta.
-copy
coleções imutáveis mudou entre o Mac OS X 10.4 e 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (role para baixo até "Coleções imutáveis e comportamento de cópia")
copy
, o que deve ser colocado na "cópia profunda"? Se o elemento for outra coleção, copy
na verdade não produz uma cópia (da mesma classe). Portanto, acho perfeitamente válido argumentar sobre o tipo de cópia desejada no caso específico.
NSCopying
/ -copy
, então ele não pode ser copiado - então você nunca deve tentar fazer uma cópia dele, porque esse não é um recurso para o qual ele foi projetado. Em termos de implementação do Cocoa, objetos não copiáveis geralmente têm algum estado de back-end C ao qual estão vinculados, portanto, hackear uma cópia direta do objeto pode levar a condições de corrida ou pior. Portanto, para responder “o que deve ser colocado na 'cópia profunda'” - Uma ref retida. A única coisa que você pode colocar em qualquer lugar quando você tem um não- NSCopying
objeto.