子类化NSWindowController,我可以提供多个init方法吗?

时间:2012-05-29 21:04:56

标签: objective-c ios macos

我希望子类化NSWindowController并提供几个标准的init方法(例如,init,initWithWindow,initWithWindowNibName)。目前,我让每个overriden方法调用它的等价超级,即init调用[super init],initWithWindow调用[super initWithWindow]等等。

这是正确的做事方式吗?或者我是否一般地设置这个方法,我应该只提供一个调用必要的超级方法的单个init方法吗?

NSWindowController如何实际实现其init方法?根据文档,initWithWindow是'默认'初始化程序 - 据说是'默认',意味着其他初始化方法调用initWithWindow。这是否意味着当我进行子类化时,我应该只有一个调用类'super?

的初始化方法

我感到困惑的是,我开始歇斯底里地笑,我的狗看起来很有趣; - )

1 个答案:

答案 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是子类的指定初始值设定项)。