Переопределение init в подклассе - PullRequest
38 голосов
/ 05 декабря 2010

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

Например, будет ли правильным следующее для подкласса 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

Ответы [ 3 ]

41 голосов
/ 05 декабря 2010

Каждый класс Cocoa Touch (и Cocoa) имеет назначенный инициализатор;для UIView, как указано в этой документации , этот метод равен 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;
}
4 голосов
/ 09 ноября 2016

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

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
       //do sth
    }
    return self;
}
4 голосов
/ 05 декабря 2010

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

Документация Apple о назначенных инициализаторах.

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

initWithCoder: обсуждается здесь, на SO .

...