iOS: архивирование NSMutableArray

Я погуглил и искал SO для этого без однозначных результатов. Кажется, у меня есть фундаментальное недопонимание следующего из документации Apple:

В архиве можно хранить граф объектов произвольной сложности. Архив сохраняет идентичность каждого объекта в графе и все отношения, которые он имеет со всеми другими объектами в графе. После разархивирования перестроенный граф объектов должен, за некоторыми исключениями, быть точной копией исходного графа объектов.

Предположим, у меня есть NSMutableArray, который представляет собой набор Person объектов. Каждый объект Person реализует initWithCoder и encodeWithCoder. Кроме того, любой заданный Person может иметь NSMutableArray объектов (аналогично совместимых с кодированием) Task.

Насколько я понимаю, существует способ архивирования, запускающий каскадную сериализацию произвольной глубины в зависимости от реализации протокола кодирования. Итак, в моем контроллере представления у меня есть willEnterBackground, который:

data = [NSKeyedArchiver archivedDataWithRootObject:self.people];
// persist to NSUserDefaults

и у меня есть viewDidLoad, который:

// read from NSUserDefaults
self.people = [NSKeyedUnarchiver unarchiveObjectWithData:data];

Все это случается, но две вещи:

  1. initWithCoder и encodeWithCoder в объектах, содержащихся в массиве people, никогда не вызываются.
  2. Неудивительно, что в результате self.people является NSMutableArray размером 0. Удивительно, но размер разархивированных данных составляет 252 байта, что выглядит примерно правильно.

Предложения? Подсказки?


person Steve Ross    schedule 31.07.2012    source источник


Ответы (1)


Несмотря на то, что вы реализовали эти 2 метода, вы объявили, что ваш класс Person находится в протоколе?

person Ryan Murphy    schedule 31.07.2012