在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
答案 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文档总是明确提到类的指定初始值设定项。
initWithCoder:
here on SO。
答案 2 :(得分:4)
如果使用Interface Builder,则调用的是:
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
//do sth
}
return self;
}