NSCoding с вложенными пользовательскими объектами?

У меня есть серия вложенных объектов, которые мне нужно выполнить через протокол NSCoding, чтобы я мог сохранить объект верхнего уровня в NSUserDefaults.

Вот структура объектов:

'Класс инструктора

  • NSMutableArray, содержащий экземпляры...

Класс 'class

  • NSMutableArray, содержащий экземпляры...

'Студенческий класс

  • Имя свойства
  • Свойство номера
  • Денежная недвижимость

Мне нужно сохранить экземпляр инструктора для NSUserDefaults или документы для приложения. Как вы можете видеть, объект Instructor содержит массив, который затем содержит экземпляры класса. Этот объект класса содержит экземпляры студентов.

Является ли протокол NSCoding рекурсивным? Я имею в виду, что если я добавлю протокол NSCoding к каждому классу, тогда я мог бы сохранить объект Instructor, и он будет рекурсивно кодировать содержащиеся объекты?

Будет ли он работать таким же образом при декодировании? Я мог бы просто декодировать один класс инструктора, и он рекурсивно расшифровал бы содержащиеся в нем объекты, поскольку они также соответствуют протоколу NSCoding?

Как я могу настроить настройку?

Ответ 1

Да, вы можете (и, вероятно, должны) написать свою поддержку для NSCoding, чтобы быть рекурсивной. Это как NSCoding должно работать.

Когда ваш инструмент encodeWithCoder, просто вызовите

[coder encodeObject: aProperty forKey: @"propertyName"];

для всех ваших свойств объекта, включая его свойства контейнера.

Затем убедитесь, что каждый объект в графе объектов объекта также соответствует NSCoding.

Для скалярных свойств вы можете сохранить скалярное значение, используя методы NSCoder, такие как encodeInt: forKey:

Чтобы сохранить объект, соответствующий стандарту NSCoding, сначала преобразовать его в NSData с использованием метода класса NSKeyedArchiver archivedDataWithRootObject, а затем сохранить полученные данные в значения по умолчанию. Очень просто, действительно.

Ответ 2

NSCoding не является волшебным, поэтому он будет работать "рекурсивно", если это скажется на реализации методов кодирования и декодирования.

Внедрить методы NSCoding и передать данные, которые будут закодированы в кодере. Внедрите методы NSCoding во всех ваших пользовательских классах, чтобы при кодировании массива все содержимое можно обрабатывать соответствующим образом.

Обязательно вызовите super, если класс суперкласса также реализует NSCoding.

например.

- (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:self.arrayOfClasses forKey:@"arrayOfClasses"];
}

- (id)initWithCoder:(NSCoder *)decoder {
    self.arrayOfClasses = [decoder decodeObjectForKey:@"arrayOfClasses"];
}