Existe-t-il une fonction intégrée qui me permet de copier en profondeur un NSMutableArray
?
J'ai regardé autour de moi, certaines personnes disent que cela [aMutableArray copyWithZone:nil]
fonctionne comme une copie profonde. Mais j'ai essayé et cela semble être une copie superficielle.
En ce moment, je fais manuellement la copie avec une for
boucle:
//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];
}
}
}
}
mais j'aimerais une solution plus propre et plus succincte.
-copy
collections immuables a changé entre Mac OS X 10.4 et 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (faites défiler jusqu'à "Collections immuables et comportement de copie")
copy
, que doit-on mettre dans la "copie complète"? Si l'élément est une autre collection, copy
ne produit pas réellement une copie (de la même classe). Je pense donc qu'il est parfaitement valable d'argumenter sur le type de copie souhaité dans le cas particulier.
NSCopying
/ -copy
, alors il n'est pas copiable - vous ne devriez donc jamais essayer d'en faire une copie, car ce n'est pas une capacité pour laquelle il a été conçu. En termes d'implémentation de Cocoa, les objets non copiables ont souvent un état de backend C auquel ils sont liés, donc le piratage d'une copie directe de l'objet peut conduire à des conditions de concurrence ou pire. Donc, pour répondre «ce qui doit être mis dans la« copie profonde »» - Une réf. La seule chose que vous pouvez mettre n'importe où quand vous avez un non- NSCopying
objet.