Несколько вопросов о переопределении функции init - PullRequest
3 голосов
/ 07 июня 2011

Будучи новичком в Objective-C, я очень озадачен функцией init и тем, как и когда ее переопределять.Итак, вот несколько вопросов:

  • По-видимому, он прекрасно работает, когда функция init не переопределяется, так что это хорошая практика?Если это так, то это очень плохая практика - не делать это?
  • Давайте предположим, что я переопределяю функцию, потому что мне нужно присвоить значение по умолчанию переменной.Нужно ли выделять и инициализировать все другие ivars, включая IBOutlets?

Обратите внимание, что мне известен синтаксис:

if ((self = [super init]))
{
    _foo = [[Bar alloc] init];
}
return self;

Ответы [ 3 ]

5 голосов
/ 07 июня 2011

Per "Инициализация" :

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

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

Когда ваш объект создается из NIB, -init не вызывается.Вместо этого ваш вновь выделенный объект получит сообщение -initWithCoder: или -initWithFrame: в зависимости от типа объекта.Процесс загрузки NIB отправляет ваш объект -awakeFromNib после того, как он и все другие созданные NIB объекты, на которые он ссылается, были установлены.Это позволяет избежать переопределения -initWithCoder: / -initWithFrame:, если вы хотите выполнить некоторую настройку после загрузки NIB.Если вы можете делать то, что хотите, переопределив -awakeFromNib вместо инициализатора, вы должны сделать это.

См. Также «Несколько инициализаторов» , что объясняет «назначенный инициализатор»концепция и то, как разные классы могут иметь разные обозначенные инициализаторы, и «Распределение и инициализация объектов» для менее понятного, но более углубленного описания соглашений о выделении и инициализации, принятых Objective-C.

4 голосов
/ 07 июня 2011

Нет необходимости переопределять -init (или назначенный инициализатор), если только вам не нужна инициализация для класса.

Вам не нужно (и не нужно) выделять или инициализировать IBOutlets.Objective-C автоматически инициализирует все переменные экземпляра, включая IBOutlets к 0 (nil).

0 голосов
/ 07 июня 2011

нет, совсем нет .... просто инициализируйте то, что вы хотите ... опять-таки IBOutlets не инициализируются ... вы устанавливаете их равными нулю, когда есть предупреждение о памяти или когда вы хотите разорвать связь. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...