Разделение на подклассы NSCoder

NSCoder’S-интерфейс является довольно общими и обширными, методами объявления закодировать и декодировать объекты и значения с и без ключей. Конкретные подклассы не требуются, чтобы должным образом реализовывать весь из NSCoderметоды и могут явно ограничить себя определенными типами операций. Например, NSArchiver не реализует decode... методы, и NSUnarchiver не реализует encode... методы. Кроме того, никакой класс не реализует включенные методы кодирования для кодирования и декодирования включенных архивов. Вызов a decode метод на NSArchiver или encode метод на NSUnarchiver повышения NSInvalidArgumentException.

Если Вы определяете подкласс NSCoder это не поддерживает включенное кодирование, как минимум Ваш подкласс должен переопределить следующие методы:

Если бы Ваши поддержки подкласса включили кодирование, то необходимо переопределить вышеупомянутые методы, а также allowsKeyedCoding метод (для возврата YES) и все включенные методы кодирования, определенные NSCoder. В обоих случаях при создании отдельных классов для кодирования и декодирования Вы не должны переопределять закодировать методы в классе декодера, ни методы декодирования в классе кодера.

Обратите внимание на то, что encodeObject: и decodeObject не среди основных методов. Они определяются абстрактно для вызова encodeValueOfObjCType:at: или decodeValueOfObjCType:at: с Objective C вводят код. Ваши реализации последних двух методов должны обработать этот случай, вызвав объект encodeWithCoder: или initWithCoder: метод и отправка надлежащих сообщений замены (как описано в Создании Замен Во время Кодирования) к объекту прежде, чем закодировать его и после декодирования его.

Ваш подкласс может переопределить другие методы для обеспечения специализированной обработки для определенных ситуаций. В частности можно реализовать любой из следующих методов:

См. описания отдельного метода для получения дополнительной информации об их требуемом поведении. Значение по умолчанию NSCoder реализации этих методов просто вызывают encodeObject:.

Если Вы переопределяете encodeConditionalObject: чтобы поддерживать условные объекты (см. Условные Объекты), знать, что первое безусловное кодирование может произойти после любого числа условных запросов кодирования, таким образом, Ваш кодер не будет знать, какое условное выражение возражает для кодирования, до, все другие объекты были закодированы.

С объектами кодируемый объект полностью ответственен за кодирование себя. Однако несколько классов возвращают эту ответственность объекту кодера, или по причинам производительности или потому что надлежащая поддержка зависит от большей информации, чем сам объект имеет. Известные классы в Основе, делающие это, NSData и NSPort. NSDataнизкоуровневая природа делает оптимизацию важной. Поэтому NSData объект всегда просит, чтобы его кодер обработал его содержание непосредственно с помощью encodeDataObject: и decodeDataObject методы, когда это получает encodeWithCoder: и initWithCoder: сообщения. Точно так же NSPort объект просит, чтобы его кодер обработал его с помощью encodePortObject: и decodePortObject методы (который только NSPortCoder реализации). Это вызвано тем, что NSPort представляет информацию, хранившую в самой операционной системе, требующей специальной обработки для передачи к другому процессу.

Эти особые случаи не влияют на пользователей объектов кодера, так как перенаправление обрабатывается самими классами в их NSCoding методы протокола. Конструктор конкретного подкласса кодера, однако, должен реализовать надлежащие пользовательские методы закодировать и декодировать NSData и (при необходимости) NSPort возражает себе.