как работают назначенные инициализаторы - PullRequest
0 голосов
/ 02 апреля 2012

У меня возникли проблемы с пониманием назначенных инициализаторов.Я изучаю Цель C из книги «Изучите Цель 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];

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

1 Ответ

0 голосов
/ 02 апреля 2012

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

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

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

...