initWithFrame: ще задейства ли init?

Направих подклас на 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:.

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