Объекты имеют то, что называется «назначенным инициализатором», то есть (может быть несколько) методов 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:
является назначенным инициализатором.