Создание замен во время кодирования сообщения
Как его абстрактный суперкласс, NSCoder
, NSPortCoder
использует методы замены, позволяющие объекту закодировать себя экземпляром другого класса или заменить другой объект для себя. Объект, возможно, должен предложить различную замену, будучи закодированным в частности NSPortCoder
объект, однако, таким образом, вместо обобщения classForCoder
и replacementObjectForCoder:
методы, NSPortCoder
вызывает classForPortCoder
и replacementObjectForPortCoder:
. Их реализации по умолчанию в NSObject
отступите к общим методам, обеспечив разумное поведение по умолчанию. (NSPortCoder
не использует специальный метод замены для декодирования; это просто использует awakeAfterUsingCoder:
как NSCoder
делает.)
Обобщение classForCoder
метод является самым полезным для отображения частных иерархий подкласса через общедоступный суперкласс, (например), помогающий устойчивости архивов, когда подклассы являются частными или подлежат изменению. Так как процессы, связывающиеся во время выполнения обычно, используют ту же версию библиотеки классов, это отображение не часто необходимо в распределенной коммуникации объектов. classForPortCoder
позволяет объекту обойти или переопределить обобщение classForCoder
поведение, отправляя его реальный класс (или просто различный от универсального случая) к коммуникационному процессу или потоку. Если Вы реализуете группу классов, использующих обобщение classForCoder
метод, необходимо также рассмотреть использование classForPortCoder
обработать особый случай кодирования с распределенной системой объектов.
Обобщение replacementObjectForCoder:
метод предлагает стандартный способ заменить различным экземпляром при кодировании времени. replacementObjectForPortCoder:
в частности допускает замену прокси по распределенному соединению объектов. Получатель a replacementObjectForPortCoder:
сообщение может спросить NSPortCoder
экземпляр, должно ли это быть закодировано bycopy
или нет, и сам возврат или прокси как надлежащий. NSObject
реализация всегда возвращает прокси, так позволяющие подклассы bycopy
кодирование должно переопределить replacementObjectForPortCoder:
для выполнения, по крайней мере, как, эта выборка делает:
- (id)replacementObjectForPortCoder:(NSPortCoder *)encoder |
{ |
if ([encoder isBycopy]) return self; |
return [super replacementObjectForPortCoder:encoder]; |
} |
Если NSPortCoder
объектные возвраты YES
когда отправлено isBycopy
сообщение, этот метод в качестве примера возвращается сам, который приводит к получателю, отправляемому encodeWithCoder:
сообщение. Если NSPortCoder
объектные возвраты NO
, этот метод вызывает реализацию суперкласса, обычно возвращающую экземпляр NSDistantObject
.