Я погуглил и искал 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];
Все это случается, но две вещи:
initWithCoder
иencodeWithCoder
в объектах, содержащихся в массивеpeople
, никогда не вызываются.- Неудивительно, что в результате
self.people
является NSMutableArray размером 0. Удивительно, но размер разархивированных данных составляет 252 байта, что выглядит примерно правильно.
Предложения? Подсказки?