Есть ли встроенная функция, которая позволяет мне глубоко копировать NSMutableArray
?
Я осмотрелся, некоторые люди говорят, что [aMutableArray copyWithZone:nil]
работает как глубокая копия. Но я попробовал, и это, кажется, мелкая копия.
Прямо сейчас я вручную делаю копию с циклом for
:
//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];
}
}
}
}
но я хотел бы более чистое, более лаконичное решение.
-copy
в неизменяемых коллекциях изменилось между Mac OS X 10.4 и 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/ (прокрутите вниз до неизменяемых коллекций и поведения копирования) - person user102008   schedule 15.01.2011copy
, что нужно поместить в глубокую копию? Если элемент является другой коллекцией,copy
на самом деле не дает копию (того же класса). Так что я думаю, что совершенно справедливо спорить о том, какой тип копии требуется в конкретном случае. - person Nikolai Ruhe   schedule 12.10.2015NSCopying
/-copy
, то он не может быть скопирован, поэтому вам никогда не следует пытаться сделать его копию, потому что это не та возможность, для которой он был разработан. С точки зрения реализации Cocoa, некопируемые объекты часто имеют некоторое внутреннее состояние C, к которому они привязаны, поэтому взлом прямой копии объекта может привести к условиям гонки или хуже. Итак, чтобы ответить «что должно быть помещено в «глубокую копию»» — сохраненный ref. Единственное, что вы можете поместить куда угодно, когда у вас есть объект, отличный отNSCopying
. - person Slipp D. Thompson   schedule 11.02.2017