Инициализация
Инициализация является этапом создания объекта, делающего недавно выделенный объект применимым путем установки его состояния в разумные начальные значения. Инициализация должна всегда происходить прямо после выделения. Это выполняется методом инициализатора (или просто, инициализатор), который Вы всегда вызываете на недавно выделенный объект. Инициализаторы могут также выполнить другие задачи установки, приносящие объект в полезное состояние, такое как загружающиеся ресурсы и память «кучи» выделения.
Форма объявления инициализатора
Условно, имя инициализатора всегда начинается init
. Это возвращает объект с динамическим контролем типов (id
) или, если инициализация не успешно выполняется, nil
. Инициализатор может включать один или несколько параметров, указывающих начальные значения.
Вот демонстрационное объявление инициализатора от NSString
класс:
- (id)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding |
Реализация инициализатора
Класс обычно реализует инициализатор для своих объектов, но требуется, чтобы. Если класс не реализует инициализатор, Какао вызывает инициализатор самого близкого наследователя класса. Однако подклассы часто определяют свой собственный инициализатор или переопределяют инициализатор их суперкласса для добавления специфичных для класса инициализаций. Если класс действительно реализует инициализатор, он должен вызвать инициализатор своего суперкласса как первый шаг. Это требование гарантирует серию инициализаций для объекта вниз цепочка наследования, начиная с корневого объекта. NSObject
класс объявляет init
метод как объектный инициализатор по умолчанию, таким образом, это всегда вызывается в последний раз, но возвращается сначала.
Основные шаги для реализации метода инициализатора являются следующим:
Вызовите инициализатор суперкласса и проверьте значение, которое он возвращает. (Используйте зарезервированное слово
super
определять суперкласс.), Если значение неnil
, инициализатор суперкласса возвратил доступный объект, таким образом, можно продолжить с инициализацией.Присвойте значения переменным экземпляра объекта. В управляемом коде памяти, если те значения являются самими объектами, копией или сохраняют их, как соответствующих.
Возвратите инициализированный объект или, если инициализация не успешно выполнялась, возвратиться
nil
.
Вот простой инициализатор, выполняющий эти шаги, инициализируя date
переменная экземпляра к текущей дате:
- (id)init { |
if (self = [super init]) { // equivalent to "self does not equal nil" |
date = [[NSDate date] retain]; |
} |
return self; |
} |
В этом коде, если возвращается суперкласс nil
, метод пропускает инициализацию и возвраты, оценивающие ее вызывающей стороне.
Класс может иметь многократные инициализаторы. Это происходит, когда данные инициализации могут взять, варьировался формы или где определенные инициализаторы, для удобства, предоставляют значения по умолчанию. В этом случае один из методов инициализации вызывают определяемым инициализатором, берущим полное дополнение параметров инициализации.