В чем разница между методом init
(т. е. назначенным инициализатором для класса) и методом initialize
в Objective-C? Какой код инициализации должен быть помещен в каждый?
Objective-C: инициализация против инициализации
Ответы (2)
-init
— это метод экземпляра, используемый для инициализации определенного объекта. +initialize
— это метод класса, который запускается перед созданием любых экземпляров класса и перед запуском других методов класса. +initialize
это не то, что вы используете большую часть времени, но это удобно для настройки любых статических переменных, которые может использовать класс в целом, или для обеспечения выполнения определенных условий перед созданием каких-либо экземпляров.
Код, относящийся к методу -init
, подробно описан в Реализация инициализатора раздела Язык программирования Objective-C. В том же документе, в разделе Объекты класса. Код, который входит в +initialize
, обычно сильно привязан к специальной функциональности класса, которая требует от вас его инициализации в первую очередь. В +initialize
(и в любом методе класса) следует помнить одну важную вещь: self
в методе класса относится к самому классу, а не к экземпляру класса.
+initialize
). На самом деле вы можете создать экземпляр класса, не отправляя этому классу сообщение (с помощью IMP
его метода создания экземпляра (обычно +allocWithZone:
, но это может варьироваться)).
- person ; 31.05.2011
if (self == [NameOfClass class])
внутри метода +initialize
, зачем нам это проверять? Я знаю, что это как-то связано с двойным вызовом метода +initialize
в родительском классе, но мне это не ясно. Любая помощь приветствуется!
- person makaed; 18.01.2014
+initialize
вызывается только один раз для каждого класса, одна реализация может вызываться несколько раз — один раз для класс, в котором он есть, и один раз для каждого подкласса, который не предоставляет свой собственный метод +initialize
.
- person Caleb; 18.01.2014
Чтобы провести параллель для Java-разработчиков, init подобен конструктору, а initialize подобен статическому блоку в классе.