2014-02-13 7 views
1

Я создал модель, которая имеет в основном вложенный массив пользовательских объектов для использования в приложении типа списка с разделенным видом (как UITableViews). Левый (ведущий) список списков, а правый (деталь) - это списки :) Некоторые другие переменные хранятся в некоторых классах, таких как isSelected, isExpanded ...Ошибка при попытке изменить свойство объекта nscopied

Все эти классы реализуют протокол NSCopying. Когда я делаю копию элемента главного списка и изменяю имя копии, которое работает, но если я что-то изменяю в элементе подробного списка, принадлежащем этому элементу главного списка, он изменяется как в копии, так и в оригинале. Поэтому, я думаю, мой вопрос заключается в том, как создать глубокую копию элемента главного списка. Я думал, что все они будут внедрять протокол NSCopying, это автоматически сделает это. Я действительно не знаю, что поставить для кода, чтобы все, что вам нужно, просто спросить.

+0

Вы должны реализовать «глубокая копия». Довольно просто, так как рекурсия будет обрабатывать большую часть его - просто реализуйте метод 'deepCopy', который проходит через все объекты, непосредственно адресованные из вашего объекта, скопированного и выполняющего' deepCopy' на каждом из них, помещая результат в копию вы создаете. –

ответ

1

Взгляните на NSKeyedArchiver - вы можете архивировать массив массивов, разблокировать его, и у вас есть глубокий скопированный клон.

(Конечно, это работает только, если все ваши объекты поддерживают архивирование.)

0

как создать глубокую копию элемента

мастера список Реализуя глубокую логику копирования в собственном коде. Глубокие копии обычно - иногда, но обычно - не просто копирование каждого объекта в коллекции и все, с чем оно связано. В любом случае, вне списков свойств, которые поддерживают глубокие копии, но ограничены очень простыми, нециклическими графами объектов.

Итак, вы должны перебирать коллекцию и копировать каждый элемент в коллекции по мере необходимости. Хотя реализация copyWithZone: может показаться разумной, глубокую копию часто выполняют путем ручного создания экземпляров новых экземпляров и при необходимости устанавливая различные атрибуты на основе оригинала, при необходимости копируя их.

0
-(MyClass)deepCopy { 
    MyClass* theCopy = [self mutableCopy]; 
    for (MyElementType* element in self.dataContainer) { 
     MyElementType* theCopiedElement = [element deepCopy]; 
     [theCopy somehowInsertThisElementInTheRightPlace:theCopiedElement]l 
    } 
    return theCopy; 
} 

Очевидно, что есть немного магии, участвующая в этой 5-е линии - как именно вы делаете это зависит от того, как вспомогательных данных предметы прикреплены к вашему объекту. Но есть действительно только 3-4 основных сценария. Рекурсия, естественно, обрабатывает все остальное.

(И заметьте, что вы можете быть «умным», а не копировать неизменные объекты и т.д.)

(Также обратите внимание, что вы можете создать «категории» для NSMutableArray и NSMutableDictionary.)

 Смежные вопросы

  • Нет связанных вопросов^_^