1

我希望继承 NSWindowController 并提供几个标准的 init 方法(例如,init、initWithWindow、initWithWindowNibName)。目前,我让每个被覆盖的方法都调用其等效的 super 即,init 调用 [super init],initWithWindow 调用 [super initWithWindow] 等等。

这是正确的做事方式吗?还是我设置得太笼统了,我应该只提供一个调用任何必要超级方法的 init 方法吗?

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

我开始感到困惑,开始歇斯底里地大笑,而我的狗看着我很有趣;-)

4

1 回答 1

3

每个类都应该有一个指定的初始化器。子类化时,您通常会选择包含最多自定义参数的初始化程序,并将其称为“指定”。重要的部分是所有其他初始化程序(特别是包括为父类描述的默认初始化程序)都调用此初始化程序。只有“指定”初始化程序调用 super,所有其他初始化程序调用 self。

例如:

//The default initializer documented by Apple for a given class:
- (id)init
{
    self = [super init];
    return self;
}

因此,假设您有几个具有各种选项的初始化程序:

此自定义初始化具有最多的参数,并且是您的新“指定”。你会注意到它调用了[super init]:

- (id)initWithParamters:(NSObject *)paramterOne andParameter:(NSObject *)paramterTwo
{
    self = [super init];
    if (self)
    {
        __ivarOne = paramterOne;
        __ivarTwo = parameterTwo;
    }

    return self;
}

你有一个额外的自定义初始化,但只接受一个参数。请注意,它调用 self (不是超级):

- (id)initWithParamter:(NSObject *)parameterOne
{
return [self initWithParamter:parameterOne andParameter:nil];
}

最后,覆盖类默认初始化程序(如文档中所述):

- (id)init
{
    return [self initWithParamter:nil];
}

总结一下:您可以在子类中实现任意数量的自定义初始化程序。一个初始化器应该被认为是你的“指定”初始化器,并且只有这个方法应该实现[super init](其中init是超类的指定初始化器,它可能不是'init')。所有其他初始化程序都应该调用 [self init] (其中 init 是您的子类的指定初始化程序)。

于 2012-05-29T21:21:33.747 回答