覆盖子类中的init

时间:2010-12-05 15:53:31

标签: objective-c inheritance uiview initialization init

在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 个答案:

答案 0 :(得分:40)

每个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 :(得分:4)

通常,您应遵循指定的初始化程序约定。指定的初始化程序是init,它涵盖所有实例变量的初始化。指定的初始化程序也是由类的其他init方法调用的方法。

Apple的documentation关于指定的初始化程序。

initWithFrame:是NSView类的指定初始值设定项。 Apple的Cocoa文档总是明确提到类的指定初始值设定项。

讨论了{p> initWithCoder: here on SO

答案 2 :(得分:4)

如果使用Interface Builder,则调用的是:

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
       //do sth
    }
    return self;
}