Будет ли initWithFrame: вызывать инициализацию?

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

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

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


person Ben Lu    schedule 21.12.2011    source источник


Ответы (1)


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

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

-(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;
}
person Tom Dalling    schedule 21.12.2011
comment
+1, но, пожалуйста, начните свои методы инициализации с init, чтобы соблюдать соглашения об именах. - person JeremyP; 21.12.2011
comment
Упс, я слишком быстро вытаскиваю foo или bar или myFunction, когда придумываю имена для демонстрации. - person Tom Dalling; 21.12.2011