init
отнюдь не похож на конструктор в Java / C ++. Конструктор всегда выполняется при создании объекта. Но исполнение init
зависит от вас. Если вы не отправите сообщение init
после alloc
, оно не будет выполнено.
// init does not execute here
MyObject *obj = [MyObject alloc];
И это будет работать без каких-либо проблем, если вы производите от NSObject
, так как init
из NSObject
ничего не делает.
Вам не нужно добавлять init
в заголовочный файл, потому что он унаследован от NSObject
, но вам нужно добавить пользовательские методы init (которые не наследуются) в заголовочный файл. Обратите внимание, что init
методы - это просто обычные методы с соглашением об именах, но технически нет никаких отличий от других методов.
Если вы не укажете свои пользовательские методы init в заголовочном файле, но отправите это сообщение объекту, компилятор выдаст предупреждение. Там не будет никакой ошибки компиляции. Так что, если вы решите проигнорировать предупреждение, вы можете опустить его и из заголовка. Но вы получите сбой во время выполнения, если метод на самом деле не реализован. Поэтому лучше добавить все методы, которые не наследуются в заголовочном файле.