我希望子类化NSWindowController并提供几个标准的init方法(例如,init,initWithWindow,initWithWindowNibName)。目前,我让每个overriden方法调用它的等价超级,即init调用[super init],initWithWindow调用[super initWithWindow]等等。
这是正确的做事方式吗?或者我是否一般地设置这个方法,我应该只提供一个调用必要的超级方法的单个init方法吗?
NSWindowController如何实际实现其init方法?根据文档,initWithWindow是'默认'初始化程序 - 据说是'默认',意味着其他初始化方法调用initWithWindow。这是否意味着当我进行子类化时,我应该只有一个调用类'super?
的初始化方法我感到困惑的是,我开始歇斯底里地笑,我的狗看起来很有趣; - )
答案 0 :(得分:3)
每个班级都应该有一个指定的初始化程序。在进行子类化时,通常会选择包含最多自定义参数的初始值设定项,并将其命名为“指定”。重要的是,所有其他初始值设定项(特别是包含为父类别描述的默认初始化程序)调用此初始值设定项。只有'指定'初始化程序调用super,所有其他调用self。
例如:
//The default initializer documented by Apple for a given class:
- (id)init
{
self = [super init];
return self;
}
所以,假设您有几个具有各种选项的初始化器:
此自定义init具有最多参数,并且是您的新“指定”。你会注意到它调用[super init]:
- (id)initWithParamters:(NSObject *)paramterOne andParameter:(NSObject *)paramterTwo
{
self = [super init];
if (self)
{
__ivarOne = paramterOne;
__ivarTwo = parameterTwo;
}
return self;
}
您有一个额外的自定义初始化,但只接受一个参数。请注意,它调用self(NOT super):
- (id)initWithParamter:(NSObject *)parameterOne
{
return [self initWithParamter:parameterOne andParameter:nil];
}
最后,覆盖类默认初始值设定项(如文档中所指定):
- (id)init
{
return [self initWithParamter:nil];
}
总结:您可以在子类中实现任意数量的自定义初始值设定项。一个初始化程序应该被视为你的“指定”初始化程序,并且只有这个方法应该实现[super init](其中init是超类的指定初始化程序,可能不是'init')。所有其他初始值设定项都应该调用[self init](其中init是子类的指定初始值设定项)。