1

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW55には、設計された初期化子が1つあると記載されています。 、および他の初期化子が設計された初期化子を呼び出すこと。

1.これの主な理由は何ですか?つまり、各セカンダリ初期化子は[super init]呼び出しを自分で実行できます(これにより、設計された初期化子になります)。

2.フォローアップの質問:セカンダリと設計された初期化子の間のすべての呼び出しはメッセージパッシングステップを生成しますか、それともコンパイラがそれを回避する方法はありますか?イニシャライザーは結局同じファイルにあるので...メッセージパッシングステップが導入された場合、質問1はさらに適切だと思います。

4

1 に答える 1

2

指定された初期化子を持つ2つの主な理由は、単純さとサブクラス化です。初期化子が多数ある場合は、それぞれがすべての作業を実行する必要があります。つまり、初期化コードをそれぞれに複製する必要があります。すべてのセカンダリ初期化子が同じ指定された初期化子を呼び出す場合、初期化コードのほとんどは1つの場所に配置でき、他の各初期化子は小さな変更を加えるだけで済みます。

サブクラス化については、多くの初期化子を持つクラスAとAのサブクラスであるクラスBの場合を考えてみます。Aに指定された初期化子がある場合、Bはすべての初期化をキャッチするためにその1つのメソッドをオーバーライドするだけです。ただし、Aの初期化子が単一のメソッドを呼び出さない場合、Bは各メソッドをオーバーライドする必要があります。そうしないと、オブジェクトを初期化する機会が常に得られるとは限りません。

はい、指定された初期化子を呼び出すとメッセージが送信されます。コンパイラーはメソッドを直接呼び出すことができますが、サブクラス化の可能性と組み合わせて、言語の動的な性質のために呼び出すことはできません。上記の例では、Aが指定された初期化子を使用しているがメッセージを送信しない場合でも、Bの指定された初期化子は呼び出されません。メッセージを渡すと、ランタイムはそのメソッドで最初のクラスを見つけることができます。また、言語は動的であるため、指定された初期化子のアドレスは、それを再定義するカテゴリをロードするか、ランタイム呼び出しを使用して直接変更することにより、実行時に変更される可能性があります。

于 2012-10-15T16:29:25.163 に答える