Я не думаю, что первый ответ является полностью правильным. Согласно документации Apple, «Сериализация сохраняет только значения объектов и их положение в иерархии. Многократные ссылки на один и тот же объект значений могут привести к множеству объектов при десериализации».
Так что не гарантируется, что сериализация одного объекта приведет к тому, что при десериализации из этих нескольких NSCoders будет один объект.
Если ваша реализация является чем-то похожим на ваш пример, то вы, возможно, думаете о вещах не совсем правильно. Если вы думаете о логической организации приложения, может иметь смысл, что несколько объектов могут совместно использовать один и тот же делегат. Но в целом я бы не ожидал, что кто-то использует протокол NSCoder для кодирования / декодирования делегатов. Обычно я ожидаю, что делегат закодирует / расшифрует объекты, для которых он является делегатом.
Например, давайте посмотрим на NSTableView. Возможно, пользователь получает возможность настроить способ отображения NSTableView (возможно, пользователю разрешено изменять размеры столбцов или выбирать, какие столбцы отображаются). Это полезная информация, которую вы можете сохранить и восстановить с использованием протокола NSCoding. У NSTableView также есть делегаты. Делегат должен быть контроллером (из парадигмы MVC) и никогда не должен действительно кодироваться / декодироваться с использованием NSCoding, потому что это общий код, который не должен поддерживать какое-либо состояние во время выполнения.
Итак, в идеале вы создаете свой делегат / контроллер, используя метод init. Он понимает, что ему нужно настроить NSTableView, чтобы он выглядел так, как он делал это в прошлый раз, когда пользователь настраивал его, поэтому он извлекает старое табличное представление с диска с помощью NSCoding, а затем отображает его пользователю так же, как это было в последний раз, когда он его видел. .
Я думаю, то же самое относится и к слою модели в парадигме MVC. Опять же, уровень контроллера должен декодировать объекты модели, которые специфичны для того, что пользователь сделал с помощью своего приложения.
Звучит так, будто вы пытаетесь создать экземпляр уровня контроллера из модели или, возможно, из слоя представления. Это не имеет смысла.