Czy jest jakaś wbudowana funkcja, która pozwala mi głęboko skopiować plik NSMutableArray
?
Rozejrzałem się, niektórzy mówią, że [aMutableArray copyWithZone:nil]
działa jak głęboka kopia. Ale próbowałem i wydaje się, że jest to płytka kopia.
W tej chwili ręcznie wykonuję kopię z for
pętlą:
//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];
}
}
}
}
ale chciałbym uzyskać czystsze, bardziej zwięzłe rozwiązanie.
-copy
niezmiennych kolekcji zmieniło się między Mac OS X 10.4 i 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/ ... (przewiń w dół do „Niezmienne kolekcje i zachowanie kopiowania”)
copy
, co należy umieścić w „głębokiej kopii”? Jeśli element jest inną kolekcją, w copy
rzeczywistości nie daje kopii (tej samej klasy). Dlatego uważam, że spór o rodzaj kopii, jaki ma być w konkretnym przypadku, jest całkowicie zasadny.
NSCopying
/ -copy
, to nie można go skopiować - więc nigdy nie powinieneś próbować tworzyć jego kopii, ponieważ nie jest to zdolność, do której został zaprojektowany. Jeśli chodzi o implementację Cocoa, obiekty nie do skopiowania często mają stan zaplecza C, z którym są powiązane, więc hakowanie bezpośredniej kopii obiektu może prowadzić do warunków wyścigu lub gorzej. Tak więc odpowiadając „co należy umieścić w„ głębokiej kopii ”” - zachowany ref. Jedyną rzeczą, którą możesz umieścić w dowolnym miejscu, gdy masz NSCopying
obiekt niebędący przedmiotem.