gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 19:19:57 26 4
gpt4 key购买 nike

我希望子类化NSWindowController并提供几种标准的初始化方法(例如init,initWithWindow,initWithWindowNibName)。目前,我让每个覆盖的方法都调用其等效的super,即init调用[super init],initWithWindow调用[super initWithWindow],依此类推。

这是做事的正确方法吗?还是我过于笼统地设置了这种方法,我是否应该只提供一个调用任何 super 方法的init方法?

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

我感到困惑,以至于我开始歇斯底里地大笑,我的狗对我看起来很滑稽;-)

最佳答案

每个类应具有一个指定的初始化程序。子类化时,通常会选择包含最多自定义参数的初始化程序,并将其称为“指定”。重要的部分是所有其他初始化程序(特别是包括为父类描述的默认初始化程序)将调用此初始化程序。只有“指定的”初始化程序调用了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;
}

您有一个附加的自定义init,但只接受一个参数。注意,它称为self(不是 super ):
- (id)initWithParamter:(NSObject *)parameterOne
{
return [self initWithParamter:parameterOne andParameter:nil];
}

最后,重写类的默认初始化程序(如文档中所指定):
- (id)init
{
return [self initWithParamter:nil];
}

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

关于objective-c - 子类化NSWindowController,我可以提供多个init方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10806692/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com