Разделение на подклассы NSCoder
NSCoder
’S-интерфейс является довольно общими и обширными, методами объявления закодировать и декодировать объекты и значения с и без ключей. Конкретные подклассы не требуются, чтобы должным образом реализовывать весь из NSCoder
методы и могут явно ограничить себя определенными типами операций. Например, NSArchiver
не реализует decode...
методы, и NSUnarchiver
не реализует encode...
методы. Кроме того, никакой класс не реализует включенные методы кодирования для кодирования и декодирования включенных архивов. Вызов a decode
метод на NSArchiver
или encode
метод на NSUnarchiver
повышения NSInvalidArgumentException
.
Если Вы определяете подкласс NSCoder
это не поддерживает включенное кодирование, как минимум Ваш подкласс должен переопределить следующие методы:
encodeValueOfObjCType:at:
decodeValueOfObjCType:at:
encodeDataObject:
decodeDataObject
versionForClassName:
Если бы Ваши поддержки подкласса включили кодирование, то необходимо переопределить вышеупомянутые методы, а также allowsKeyedCoding
метод (для возврата YES
) и все включенные методы кодирования, определенные NSCoder
. В обоих случаях при создании отдельных классов для кодирования и декодирования Вы не должны переопределять закодировать методы в классе декодера, ни методы декодирования в классе кодера.
Обратите внимание на то, что encodeObject:
и decodeObject
не среди основных методов. Они определяются абстрактно для вызова encodeValueOfObjCType:at:
или decodeValueOfObjCType:at:
с Objective C вводят код. Ваши реализации последних двух методов должны обработать этот случай, вызвав объект encodeWithCoder:
или initWithCoder:
метод и отправка надлежащих сообщений замены (как описано в Создании Замен Во время Кодирования) к объекту прежде, чем закодировать его и после декодирования его.
Ваш подкласс может переопределить другие методы для обеспечения специализированной обработки для определенных ситуаций. В частности можно реализовать любой из следующих методов:
encodeRootObject:
encodeConditionalObject:
encodeBycopyObject:
encodeByrefObject:
См. описания отдельного метода для получения дополнительной информации об их требуемом поведении. Значение по умолчанию NSCoder
реализации этих методов просто вызывают encodeObject:
.
Если Вы переопределяете encodeConditionalObject:
чтобы поддерживать условные объекты (см. Условные Объекты), знать, что первое безусловное кодирование может произойти после любого числа условных запросов кодирования, таким образом, Ваш кодер не будет знать, какое условное выражение возражает для кодирования, до, все другие объекты были закодированы.
С объектами кодируемый объект полностью ответственен за кодирование себя. Однако несколько классов возвращают эту ответственность объекту кодера, или по причинам производительности или потому что надлежащая поддержка зависит от большей информации, чем сам объект имеет. Известные классы в Основе, делающие это, NSData
и NSPort
. NSData
низкоуровневая природа делает оптимизацию важной. Поэтому NSData
объект всегда просит, чтобы его кодер обработал его содержание непосредственно с помощью encodeDataObject:
и decodeDataObject
методы, когда это получает encodeWithCoder:
и initWithCoder:
сообщения. Точно так же NSPort
объект просит, чтобы его кодер обработал его с помощью encodePortObject:
и decodePortObject
методы (который только NSPortCoder
реализации). Это вызвано тем, что NSPort
представляет информацию, хранившую в самой операционной системе, требующей специальной обработки для передачи к другому процессу.
Эти особые случаи не влияют на пользователей объектов кодера, так как перенаправление обрабатывается самими классами в их NSCoding
методы протокола. Конструктор конкретного подкласса кодера, однако, должен реализовать надлежащие пользовательские методы закодировать и декодировать NSData
и (при необходимости) NSPort
возражает себе.