Объектное кодирование
Объектное кодирование преобразовывает идентификационные данные класса объекта и состояние к формату, который может быть сохранен или передан между процессами. Тип класса и данные экземпляра записаны в поток байтов, который может сохраниться после того, как программа завершается. Когда программа запускается снова, недавно выделенный объект может декодировать сохраненное собственное представление и само восстановление к его предыдущему состоянию во время выполнения. Кодирование обычно происходит совместно с архивацией, помещающей график объектов в формат (архив), который может быть записан в файловую систему; разархивирование воздействует на архив, прося, чтобы каждый объект в сохраненном графике декодировал себя.
Объектное кодирование также используется в распределенном OS X, возражает API для передачи объектов от одного процесса до другого. Однако его наиболее популярный способ использования для архивации, которая как список свойств, механизм для объектной персистентности.
Как закодировать и декодировать объекты
Для Вашего подкласса, чтобы закодировать и декодировать его экземпляры, это должно соответствовать NSCoding
протокол и реализация два метода: initWithCoder:
и encodeWithCoder:
. Когда программа разархивировала или архивирует граф объектов, эти методы вызываются. В encodeWithCoder:
метод, Вы кодируете значения важных переменных экземпляра объекта; в initWithCoder:
метод, Вы декодируете те значения и повторно присваиваете их их переменным экземпляра. Если объект получает initWithCoder:
сообщение, ни один из его методов инициализатора не вызывается.
Единственный параметр initWithCoder:
и encodeWithCoder:
NSCoder
возразите, чья цель состоит в том, чтобы выполнить фактическое декодирование или кодирование. Поскольку NSCoder
абстрактный класс, объект кодера является в большинстве случаев экземпляром одного из следующих конкретных подклассов: NSKeyedArchiver
, NSKeyedUnarchiver
, NSArchiver
, NSUnarchiver
. archiver классы объявляют методы для кодирования переменных экземпляра объекта; unarchiver классы объявляют методы для декодирования переменных экземпляра.
NSCoder
методы работают над объектами, скалярами, C массивы, структуры и строки, и на указателях на эти типы. Прежде чем Вы будете кодировать или будете декодировать переменную экземпляра своего собственного класса, убедиться сначала вызвать реализацию суперкласса initWithCoder:
или encodeWithCoder:
. При декодировании объектов от потока байтов убедиться сохранить или скопировать их при присвоении их их переменным экземпляра.
Включенный по сравнению с последовательной архивацией
Два из бетона NSCoder
подклассы отличаются друг от друга фундаментальным способом. «Включенный» archiver класс (NSKeyedArchiver
и NSKeyedUnarchiver
) свяжите закодированное значение со строковым ключом и используйте тот же самый ключ при декодировании того значения; таким образом переменные экземпляра могут кодироваться и декодироваться в любой последовательности. С другим типом кодера (NSArchiver
и NSUnarchiver
) Вы кодируете переменные экземпляра в определенной последовательности, и необходимо декодировать их в той же последовательности. Последовательные кодеры должны использоваться только с устаревшим кодом; новые подклассы должны использовать включенные архивные кодеры.