1

NSWindowControllerをサブクラス化し、いくつかの標準initメソッド(たとえば、init、initWithWindow、initWithWindowNibName)を提供したいと思います。現時点では、オーバーライドされた各メソッドで同等のスーパーを呼び出すようにしています。つまり、initは[super init]を呼び出し、initWithWindowは[superinitWithWindow]を呼び出します。

これは物事を行うための適切な方法ですか?または、これをあまりにも一般的に設定しているので、必要なスーパーメソッドを呼び出す単一のinitメソッドを提供する必要がありますか?

NSWindowControllerは実際にそのinitメソッドをどのように実装しますか?ドキュメントによると、initWithWindowは「デフォルト」の初期化子です。おそらく「デフォルト」は、他の初期化メソッドがinitWithWindowを呼び出すことを意味します。これは、サブクラス化するときに、クラスのスーパーを呼び出す初期化メソッドを1つだけ持つ必要があることを意味しますか?

私はヒステリックに笑い始め、私の犬が私を面白く見ているところまで混乱しています;-)

4

1 に答える 1

3

各クラスには、指定された初期化子が1つ必要です。サブクラス化するときは、通常、最もカスタムなパラメーターを含む初期化子を選択し、それを「指定」と呼びます。重要な部分は、他のすべての初期化子(特に、親クラスラー用に記述されたデフォルトの初期化子を含む)がこの初期化子を呼び出すことです。'指定された'初期化子のみがsuperを呼び出し、他のすべてはselfを呼び出します。

例えば:

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

したがって、さまざまなオプションを備えた初期化子がいくつかあるとします。

このカスタムinitは最も多くのパラメーターを持ち、新しい「指定」です。[superinit]と呼ばれていることに気付くでしょう。

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

    return self;
}

追加のカスタムinitがありますが、パラメーターは1つだけです。それが自己を呼び出すことに注意してください(スーパーではありません):

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

最後に、クラスのデフォルトの初期化子をオーバーライドします(ドキュメントで指定されているとおり)。

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

要約すると、サブクラスに必要な数のカスタム初期化子を実装できます。1つの初期化子は「指定された」初期化子と見なされ、このメソッドのみが[super init]を実装する必要があります(initはスーパークラスの指定された初期化子であり、「init」ではない場合があります)。他のすべての初期化子は[selfinit]を呼び出す必要があります(initはサブクラスの指定された初期化子です)。

于 2012-05-29T21:21:33.747 に答える