Цель-C: Должны ли методы init быть объявлены в .h? - PullRequest
12 голосов
/ 19 июля 2011

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

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

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

(id) initWithName:(NSString *) name

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

Ответы [ 2 ]

12 голосов
/ 19 июля 2011

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

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

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

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

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

0 голосов
/ 19 июля 2011

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

...