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

标签 objective-c ios macos

我希望子类化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/

相关文章:

objective-c - 对象有效时 NSDictionary writeToFile 失败,权限为 0k

macos - 如何提高 mac 操作系统上的 xset 速率?

ios - 应用程序崩溃: when writeVideoAtPathToSavedPhotosAlbum using ALAssetsLibrary

ios - 对象初始化风格

ios - 如何在 iOS 中安排可以暂停或删除的本地通知?

ios - 谷歌地图 IOS SDK : viewMap. myLocationEnabled = true。不工作

objective-c - 从 CMSampleBuffer 制作 UIImage 会发生什么?

ios - AVSpeechSynthesizer continueSpeaking 不起作用

php - 在 iOS 和 Android 的 PHP 中创建 SQLite 文件

ruby - rvm install 2.1.4 在 OSX 上挂起