Копирование наборов

Существует два вида объектного копирования: мелкие копии и глубоко копируют. Нормальная копия является мелкой копией, производящей новый набор, совместно использующий владение объектов с оригиналом. Глубокие копии создают новые объекты из оригиналов и добавляют тех к новому набору. Это различие проиллюстрировано рисунком 1.

Рисунок 1  Мелкие копии и глубоко копирует

Мелкие копии

Существует много способов сделать мелкую копию набора. При создании мелкой копии объекты в исходном наборе отправляются a retain обменивайтесь сообщениями и указатели копируются в новый набор. Перечисление 1 показывает некоторые способы создать новый набор с помощью мелкой копии.

Перечисление 1  , Делающее мелкую копию

NSArray *shallowCopyArray = [someArray copyWithZone:nil];
 
NSDictionary *shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:NO];

Эти методы не ограничиваются показанными наборами. Например, можно скопировать набор с copyWithZone: метод — или mutableCopyWithZone: метод — или массив с initWithArray:copyItems: метод.

Глубокие копии

Существует два способа сделать глубокие копии набора. Можно использовать эквивалент набора initWithArray:copyItems: с YES как второй параметр. При создании глубокой копии набора таким образом каждый объект в наборе отправляется a copyWithZone: сообщение. Если объекты в наборе приняли NSCopying протокол, объекты глубоко копируются в новый набор, который является тогда единственным владельцем скопированных объектов. Если объекты не принимают NSCopying протокол, пытаясь скопировать их таким способом приводит к ошибке периода выполнения. Однако copyWithZone: производит мелкую копию. Этот вид копии только способен к созданию одного уровня, глубоко копируют. Если Вам только нужен один уровень, глубоко копируют, можно явно потребовать тот как в Перечислении 2.

Перечисление 2  , Делающее глубокую копию

NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];

Этот метод применяется к другим наборам также. Используйте эквивалент набора initWithArray:copyItems: с YES как второй параметр.

Если Вам нужна истина, глубоко копируют, такой как тогда, когда у Вас есть массив массивов, можно заархивировать и затем разархивировать набор, обеспечил содержание, которому все приспосабливают NSCoding протокол. Пример этого метода показан в Перечислении 3.

Перечисление 3  истина глубоко копирует

NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
          [NSKeyedArchiver archivedDataWithRootObject:oldArray]];

Копирование и переменчивость

То, когда Вы копируете набор, переменчивость того набора или объектов, это содержит, может быть затронуто. Каждый метод копирования имеет немного отличающиеся эффекты на переменчивость объектов в наборе произвольной глубины: