Поскольку выражение присваивания также возвращает результат присваивания,
if (self = [super init]) { ...
эквивалентно:
self = [super init];
if (self) { ...
И поскольку if
не просто проверяет чистые логические значения, нообрабатывает все, что не равно нулю, не NULL
или не nil
как истинное, оператор if
проверяет, если self
равно nil
после присваивания.
Когда мы пишемсобственные init
методы, мы должны присвоить [super init]
self
, потому что метод init
может возвращать объект, отличный от получателя метода.Если бы мы просто вызвали [super init]
без присвоения ему self
, мы могли бы инициализировать объект, отличный от self
, что явно нежелательно.