2010-12-05 2 views
36

В Objective-C необходимо ли переопределять все наследуемые конструкторы подкласса для добавления пользовательской логики инициализации?Переопределение init в подклассе

Например, подходит ли подкласс UIView к пользовательской логике инициализации?

@implementation CustomUIView 

- (id)init { 
    self = [super init]; 
    if (self) { 
     [self initHelper]; 
    } 
    return self; 
} 

- (id)initWithFrame:(CGRect)theFrame { 
    self = [super initWithFrame:theFrame]; 
    if (self) { 
     [self initHelper]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super initWithCoder:decoder]; 
    if (self) { 
     [self initHelper]; 
    } 
    return self; 
} 

- (void) initHelper { 
    // Custom initialization 
} 

@end 

ответ

38

Каждый класс Cocoa Touch (и Cocoa) имеет назначенный инициализатор; для UIView, как указано in this documentation, это способ initWithFrame:. В этом конкретном случае вам нужно будет только переопределить initWithFrame; все остальные вызовы будут каскадом вниз и ударить этот метод, в конце концов.

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

- (id)initWithFrame:(CGRect)theFrame puzzle:(Puzzle *)thePuzzle title:(NSString *)theTitle { 
    self = [super initWithFrame:theFrame]; 
    if (self) { 
     [self setPuzzle:thePuzzle]; 
     [self setTitle:theTitle]; 
     [self initHelper]; 
    } 
    return self; 
} 
+1

Так, даже если я например CustomUIView с простой инициализации, он будет вызывать initWithFrame? – hpique 2010-12-05 16:39:54

4

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

Apple's documentation о назначенных инициализаторах.

initWithFrame: является назначенным инициализатором класса NSView. Документация Apple Cocoa всегда явно упоминает назначенный инициализатор класса.

initWithCoder: обсуждается here on SO.

2

В случае использования Interface Builder, то один называется это:

- (id)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     //do sth 
    } 
    return self; 
} 
Смежные вопросы