Я предполагаю, что для создания экземпляра вашего оконного контроллера в Interface Builder вы перетащили общий экземпляр NSObject
в файл пера, а затем назначили свой собственный подкласс NSWindowController
в качестве класса объекта, это правильно? Если это так, то я думаю, что ключевое различие здесь заключается в том, что вы имеете дело с созданием экземпляра универсального объекта, а не пользовательского объекта, включенного в одну из палитр IB.
В большинстве случаев, когда вы создаете и настраиваете объект с помощью IB, настройки, которые вы указываете в различных инспекторах, кодируются с использованием метода encodeWithCoder:
при сохранении файла пера. Когда вы затем загружаете этот файл пера в свое приложение, эти объекты инициализируются с использованием метода initWithCoder:
.
Однако в случае экземпляра универсального объекта Interface Builder не обязательно знает что-либо о классе объекта, экземпляр которого создается. Поскольку вы можете указать любое имя класса для создания экземпляра, если вы укажете класс, который IB не загрузил через палитру или фреймворк, он не сможет сериализовать этот объект с помощью NSCoding
. Поэтому я считаю, что когда вы создаете такой универсальный объект, он инициализируется с использованием init
, а не initWithCoder:
, потому что он не был сохранен с использованием encodeWithCoder:
в первую очередь при сохранении файла пера.
Я не знаю, задокументировано ли это где-нибудь, но я думаю, именно поэтому вы видите разницу. Я также не думаю, что это специфично для NSWindowController
, скорее вы увидите такое же поведение любого объекта, созданного как общий NSObject
в IB, независимо от конкретного класса.
person
Brian Webster
schedule
16.08.2010