Копирование наборов
Существует два вида объектного копирования: мелкие копии и глубоко копируют. Нормальная копия является мелкой копией, производящей новый набор, совместно использующий владение объектов с оригиналом. Глубокие копии создают новые объекты из оригиналов и добавляют тех к новому набору. Это различие проиллюстрировано рисунком 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]]; |
Копирование и переменчивость
То, когда Вы копируете набор, переменчивость того набора или объектов, это содержит, может быть затронуто. Каждый метод копирования имеет немного отличающиеся эффекты на переменчивость объектов в наборе произвольной глубины:
copyWithZone:
делает поверхностный уровень неизменным. Все более глубокие уровни имеют переменчивость, которую они ранее имели.initWithArray:copyItems:
сNO
поскольку второй параметр дает поверхностному уровню переменчивость класса, это выделяется как. Все более глубокие уровни имеют переменчивость, которую они ранее имели.initWithArray:copyItems:
сYES
поскольку второй параметр дает поверхностному уровню переменчивость класса, это выделяется как. Следующий уровень является неизменным, и все более глубокие уровни имеют переменчивость, которую они ранее имели.Архивация и разархивирование набора оставляют переменчивость всех уровней, как это было прежде.