2

今、私はかなり長い間この問題に頭を悩ませていましたが、これを明確にしてくれる人が本当に必要です.

1) 指定された初期化メソッドは、サブクラス化された init メソッドによって呼び出されたときに、コンパイラによってどのように決定されますか? 一番カバー力があると言われています。

2) 複数の init メソッドでサブクラス化する場合、各クラスには独自の指定された初期化メソッドがありますか? 質問 2 への回答も、これを理解するのに役立ちます。

3) 複数のクラスが指定されたイニシャライザを持っている場合、他の init メソッドはどのようにそのクラスで指定されたイニシャライザを呼び出しますか? また、他の初期化子も呼び出さないのはなぜですか? なぜ指定されたイニシャライザ? それについて何が特別なのですか?

4

2 に答える 2

2
  1. コンパイラはそれをまったく検出しません。コンパイラーがイニシャライザーが指定されているかどうかを知るには、NS_DESIGNATED_INITIALIZERマクロを使用して注釈を付ける必要があります。

  2. クラスにイニシャライザがある場合は、常に指定されたイニシャライザもあります。実際には、複数の指定された初期化子を持つことができます。指定された初期化子なしでクラスを持つことはできません。指定と便利の違いは非常に単純です。指定されたイニシャライザは[super init...]、コンビニエンス コール[self init...](同じクラスの別のイニシャライザを呼び出す) を呼び出します (スーパークラス イニシャライザを呼び出す)。

  3. 便利な初期化子は、 を使用して指定されたものを呼び出します[self init...]。指定された初期化子は特別なものではありません。これらは、実際には最も基本的な初期化子です。それらは 2 つのことを行います - 親を ( を使用して[super init...]) 初期化し、次に必要なものを初期化します (たとえば、プロパティのデフォルト値など)。便利なイニシャライザは特別な種類のものです。これらは、指定されたイニシャライザの拡張です。指定されたイニシャライザを呼び出して、さらに何かを行います。たとえば-initWithStyle:、オブジェクトを特定のスタイルに初期化する指定された初期化子になります。-initWithStyle:andFrame:同じことを行いますが、frameプロパティを特定の値に設定します。-initWithStyle:andFrame:を使用して実装されている場合は[self initWithStyle:... andFrame:...]、便利な初期化子です。

于 2015-08-30T00:01:09.640 に答える