Цель-C: минимальный init против init, который вызывает initWith? - PullRequest
0 голосов
/ 16 мая 2018

Метод init в большинстве классов выполняет минимальную инициализацию, потому что если вам нужно больше сложности, больше поведения, связанного с этим, вам нужно использовать метод initWith. Так зачем кому-то вызывать initWith из метода init? Я видел это, это даже упоминается на веб-сайте Apple, но, похоже, скрывает поведение, которое должно быть явно названо.

1 Ответ

0 голосов
/ 16 мая 2018

Объекты имеют то, что называется «назначенным инициализатором», то есть (может быть несколько) методов init..., которые должны полностью инициализировать и настроить объект для использования.

На примере UIView обозначен инициализатор initWithFrame:CGRect. Это инициализирует вид с рамкой (duh).

Если бы init был назначенным инициализатором, ему все равно пришлось бы определять кадр, вероятно, CGRectZero, а initWithFrame: должен был бы вызвать init, а затем setFrame:, что означает установку кадра дважды. Нам не нравится делать что-то дважды, когда это можно сделать один раз.

Именно поэтому во многих случаях init используется вместо этого в качестве ярлыка, когда свойства в других инициализаторах могут иметь значение по умолчанию, обычно это какой-то ноль. В случае CGRect, CGRectZero является нулевым значением.

Кроме того, поскольку frame является важным свойством UIView, если назначенный вами инициализатор был init, вы увидите много этого:

UIView *view = [[UIView alloc] init];
view.frame = CGRectMake(0, 0, 20, 20)

Имеет смысл объединить эти две строки в одну, поэтому initWithFrame: является назначенным инициализатором.

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