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