Per "Инициализация" :
Класс обычно реализует инициализатор для своих объектов, но не обязателен.Если класс не реализует инициализатор, Какао вызывает инициализатор ближайшего предка класса.Однако подклассы часто определяют свой собственный инициализатор или переопределяют инициализатор своего суперкласса, чтобы добавить специфичные для класса инициализации.Если класс действительно реализует инициализатор, он должен вызвать инициализатор своего суперкласса в качестве первого шага.Это требование обеспечивает серию инициализаций для объекта в цепочке наследования, начиная с корневого объекта.Класс NSObject
объявляет метод init
в качестве инициализатора объекта по умолчанию, поэтому он всегда вызывается последним, но возвращается первым.
Как говорится, вы переопределяете инициализатор, назначенный вашему суперклассу, когда вам нужно выполнить некоторую инициализацию после того, как это будет сделано с его инициализацией.Не нужно это делать?Тогда вам не нужно переопределять.
Когда ваш объект создается из NIB, -init
не вызывается.Вместо этого ваш вновь выделенный объект получит сообщение -initWithCoder:
или -initWithFrame:
в зависимости от типа объекта.Процесс загрузки NIB отправляет ваш объект -awakeFromNib
после того, как он и все другие созданные NIB объекты, на которые он ссылается, были установлены.Это позволяет избежать переопределения -initWithCoder:
/ -initWithFrame:
, если вы хотите выполнить некоторую настройку после загрузки NIB.Если вы можете делать то, что хотите, переопределив -awakeFromNib
вместо инициализатора, вы должны сделать это.
См. Также «Несколько инициализаторов» , что объясняет «назначенный инициализатор»концепция и то, как разные классы могут иметь разные обозначенные инициализаторы, и «Распределение и инициализация объектов» для менее понятного, но более углубленного описания соглашений о выделении и инициализации, принятых Objective-C.