как работают назначенные инициализаторы

У меня возникли проблемы с пониманием назначенных инициализаторов. Я изучаю Objective C из книги «Learn Objective C на Mac». Ниже приведен файл реализации.

#import "Tire.h"


@implementation Tire

- (id) init
{
    if (self = [self initWithPressure: 34 treadDepth: 20]) {
    }

    return (self);

} // init


- (id) initWithPressure: (float) p
{
    if (self = [self initWithPressure: p treadDepth: 20.0]) {
    }

    return (self);

} // initWithPressure


- (id) initWithTreadDepth: (float) td
{
    if (self = [self initWithPressure: 34.0 treadDepth: td]) {
    }

    return (self);
} // initWithTreadDepth


- (id) initWithPressure: (float) p treadDepth: (float) td
{
    if (self = [super init]) {
        pressure = p;
        treadDepth = td;
    }

    return (self);
} // initWithPressure:treadDepth:

Насколько я понимаю:

- (id) initWithPressure: (float) p treadDepth: (float) td

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

Tire *aTire = [[Tire alloc] init];

тогда будет выполнен вышеупомянутый метод инициализации. Однако, поскольку метод содержит «давление = p», чему равно давление, поскольку до этого этапа мы не придавали «p» никакого значения. Кроме того, что происходит после завершения выполнения этого метода? Какой следующий метод «инициализации» в очереди?


person Rounak    schedule 02.04.2012    source источник


Ответы (1)


init в методе класса Tire вызывает [self initWithPressure: 34 treadDepth: 20], поэтому давление будет 34.

Следующим методом в цепочке будет метод init из суперкласса, потому что метод initWithPressure: (float) treadDepth: (float) вызывает его явно: [super init].

После завершения initWithPressure: (float) treadDepth: (float) выполнение продолжается с точки, где была вызвана initWithPressure....

person Peter Štibraný    schedule 02.04.2012