Objective-C: инициализация против инициализации

В чем разница между методом init (т. е. назначенным инициализатором для класса) и методом initialize в Objective-C? Какой код инициализации должен быть помещен в каждый?


person jrdioko    schedule 31.05.2011    source источник


Ответы (2)


-init — это метод экземпляра, используемый для инициализации определенного объекта. +initialize — это метод класса, который запускается перед созданием любых экземпляров класса и перед запуском других методов класса. +initialize это не то, что вы используете большую часть времени, но это удобно для настройки любых статических переменных, которые может использовать класс в целом, или для обеспечения выполнения определенных условий перед созданием каких-либо экземпляров.

Код, относящийся к методу -init, подробно описан в Реализация инициализатора раздела Язык программирования Objective-C. В том же документе, в разделе Объекты класса. Код, который входит в +initialize, обычно сильно привязан к специальной функциональности класса, которая требует от вас его инициализации в первую очередь. В +initialize (и в любом методе класса) следует помнить одну важную вещь: self в методе класса относится к самому классу, а не к экземпляру класса.

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

Чтобы провести параллель для Java-разработчиков, init подобен конструктору, а initialize подобен статическому блоку в классе.

person Eki    schedule 23.03.2013
comment
Потрясающее объяснение! Большое спасибо! - person Sakthimuthiah; 20.03.2014