4

Objective-C では、クラスの指定された初期化子が常に確実に呼び出されるという規則があるという事実を信頼できますか? それとも、いくつかの例外を除いて、ほぼ常に正しいと言えるでしょうか? たとえばUIViewドキュメントには次のように記載されています。

initWithFrame:

プログラムでビュー オブジェクトを作成する場合、このメソッドは UIView クラスの指定された初期化子です。サブクラスは、このメソッドをオーバーライドしてカスタム初期化を実行できますが、実装の最初に super を呼び出す必要があります。

Interface Builder を使用してインターフェイスを設計する場合、ビュー オブジェクトが後で nib ファイルから読み込まれるときに、このメソッドは呼び出されません。nib ファイル内のオブジェクトは再構成され、initWithCoder: メソッドを使用して初期化されます。

または、プログラムによる場合、ルールは常に適切に設計されたクラスに適用されるべきであると言えますが、Interface Builder は、プログラム以外の方法でオブジェクトを一種の「復活」または構築するため、少し異なります。もしそうなら、私たちが iOS プログラミングを行うとき、それらは一般的に他の例外ですか?

4

1 に答える 1

4

実は、Interface Builder で設計されたクラスはアーカイブされてお​​らず、初期化されていません。

アーカイブされるということは、クラスが初期化されずにアンアーカイブされることを意味するため、このinitWithCoder:メソッドは、Interface Builder によって構成されたアーカイブ済み属性を使用して、ロード時にコントロールを設定する責任を負います。

オブジェクトがロードされた後に毎回呼び出されるメソッドに初期化操作を配置する必要がawakeFromNib:あります。これにより、初期化ステートメントが確実に呼び出されます。

于 2012-09-22T07:28:42.647 に答える