Будет ли initWithFrame: вызывать init? - PullRequest
8 голосов
/ 21 декабря 2011

Я сделал подкласс UIImageView, и я хочу добавить что-то, что будет запускаться всякий раз, когда я вызываю initWithFrame или initWithImage или Init ...

-(id) init {
  [super init];
  NSLog(@"Init triggered.");
}

Если я вызываю -initWithFrame: метод, будет ли -init выше также будет срабатывать?

1 Ответ

8 голосов
/ 21 декабря 2011

Каждый класс должен иметь назначенный инициализатор .Если UIImageView следует этому соглашению (должно быть, но я его не проверял), то вы обнаружите, что вызов -init в итоге вызовет -initWithFrame:.

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

-(id) initWithFrame:(CGRect)frame;
{
    if((self = [super initWithFrame:frame])){
        //do initialisation here
    }
    return self;
}

Или вот так:

//always override superclass's designated initialiser
-(id) initWithFrame:(CGRect)frame;
{
    return [self initWithSomethingElse];
}

-(id) initWithSomethingElse;
{
    //always call superclass's designated initializer
    if((self = [super initWithFrame:CGRectZero])){
        //do initialisation here
    }
    return self;
}
...