Если вы не возражаете против количества времени, необходимого для большого графа объектов, и вы на самом деле хотите получить глубокие копии объектов, вы можете сериализовать свой граф объектов и затем десериализовать его. Самый простой способ сделать это (при условии, что все ваши объекты являются объектами Foundation Collection) - это использовать класс NSPropertyListSerialization . Сериализуйте ваш корневой объект в данные, затем десериализуйте в изменяемый массив корневого уровня, используя опцию NSPropertyListMutableContainersAndLeaves
. Полученный в результате изменяемый массив корневого уровня будет глубокой копией, а все контейнеры будут изменяемыми. Важно помнить, что это действительно будет глубокая копия, поэтому, если вы измените что-то в другом контейнере, это изменение не будет отражено в исходных объектах.
Вот краткий пример кода:
// Assumes the root-level object is an array, adjust as necessary
- (NSMutableArray*)deepMutableCopyOfArray:(NSArray*)array error:(NSError**)outError
{
NSError* error = nil;
NSData* serializedData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:&error];
if( !serializedData ) {
if( outError ) *outError = error;
return nil;
}
NSMutableArray* mutableCopy = [[NSPropertyListSerialization propertyListWithData:serializedData options:NSPropertyListMutableContainersAndLeaves format:NULL error:&error] retain];
if( !mutableCopy ) {
if( outError ) *outError = error;
return nil;
}
return mutableCopy;
}