Глубокая копия и мелкая копия
Я прочитал ответ на разницу между глубокой копией и мелкой копией из сообщения, В чем разница между глубокой копией и мелкой копией?. Теперь я сомневаюсь, что когда мы сделали мелкую копию
newArray = [NSmutableArray arrayWithArray:oldArray];
новый массив будет указывать на oldArray. (Как видно из рисунка). Теперь, когда я удаляю объект из newArray? Как из рисунка, он должен удалить один и тот же элемент из oldArray тоже!!! Кажется,
newArray = oldArray
- мелкая копия, а newArray = [NSmutableArray arrayWithArray:oldArray];
- глубокая копия. Правильно?
Ответы
Ответ 1
newArary = oldArray
не является копией вообще. Вы получаете два указателя, указывающих на тот же самый массив.
newArray = [NSMutableArray arrayWithArray:oldArray];
является мелкой копией. Вы получаете два разных массива, поэтому, если вы должны удалить или добавить элементы из одного массива, это не повлияет на другой массив. Однако элементы в двух массивах идентичны. Если первый элемент oldArray
был NSMutableDictionary
, и вы добавили к нему ключ, вы увидите это изменение и для первого элемента newArray
(так как эти два объекта одинаковы).
Чтобы сделать глубокую копию, вам нужно будет создать новый массив, и каждый элемент нового массива будет представлять собой глубокую копию соответствующего элемента старого массива. (Да, это определение является рекурсивным).
Ответ 2
Прежде всего, NSArray
не имеет функции глубокой копии. Однако вы можете сделать глубокую функцию копирования, выполнив следующие действия:
@interface NSArray(deepCopy)
-(NSArray *) deepCopy;
@end
@implementation
-(NSArray *) deepCopy
{
NSMutableArray *ret = [NSMutableArray array];
for (id val in self)
{
if ([val conformsToProtocol:@protocol(NSCopying)])
{
[ret addObject:[val copy]];
}
else
{
[ret addObject:val];
}
}
return ret;
}
@end
Во-вторых, newArray = oldArray
не копирует массив. Это просто означает, что newArray
указывает на массив, который указывает oldArray
.
В-третьих, +arrayWithArray:
делает мелкую копию массива, то есть отдельные объекты НЕ копируются.
Ответ 3
Вы также можете вызвать [[NSArray alloc] initWithArray:arraytoBeCopied copyItems:YES];
Ответ 4
В Objective-C ключевое слово "Копировать" просто увеличьте "Удержание счета" объекта. Поэтому использование "Копировать" не будет выполнять копию.
Но когда мы делаем изменение в объекте, тогда Objective-C создаем копию исходного объекта в это время.
Пожалуйста, поправьте меня, если я ошибаюсь.
Спасибо