Objective-C: Должны ли быть объявлены методы init в .h?

Прежде всего, как я понимаю, init в Objective-C, функционально похож на конструктор в Java, поскольку он используется для инициализации переменных экземпляра и подготовки класса для выполнения некоторой работы. Правильно ли это?

Я понимаю, что NSObject реализует init, и поэтому он не должен быть объявлен в каких-либо файлах .h.

Но как насчет пользовательской реализации init для данного класса, например:

(id) initWithName:(NSString *) name

Должна ли такая декларация быть указана как часть .h, или это необязательно? Это делается по соглашению или есть ли какие-либо другие соображения?

Ответ 1

init отнюдь не похож на конструктор в Java/С++. Конструктор всегда выполняется, когда объект создается. Но выполнение init зависит от вас. Если вы не отправите сообщение init после alloc, то оно не будет выполнено.

// init does not execute here
MyObject *obj = [MyObject alloc];

И это будет работать без проблем, если вы выйдете из NSObject, поскольку init of NSObject ничего не делает.

Вам не нужно добавлять init в заголовочный файл, потому что он наследуется от NSObject, но вам нужно добавить в файл заголовка собственные методы init (которые не наследуются). Обратите внимание, что методы init - это просто обычные методы с соглашением об именах, но технически нет никакой разницы с другими методами.

Если вы не укажете свои собственные методы init в файле заголовка, но отправьте это сообщение объекту, компилятор будет генерировать предупреждение. Ошибка компиляции не будет. Поэтому, если вы решите игнорировать предупреждение, вы также можете опустить это из заголовка. Но вы получите потерю времени выполнения, если этот метод фактически не реализован. Поэтому лучше добавить все методы, которые не наследуются в заголовочном файле.

Ответ 2

Да, вы должны объявить об этом, если хотите, чтобы вы могли называть этот персонализированный метод инициализации (initWithName). И первое, что вы должны сделать в этом методе, - вызвать [super init];.