Создание замен во время кодирования сообщения

Как его абстрактный суперкласс, 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.