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