3

http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.htmlの次のテキストを検討してください。

サブクラスを作成するときは、継承された初期化子が問題になります。場合によっては、スーパークラスの init... メソッドがクラスのインスタンスを十分に初期化することがあります。しかし、そうならない可能性が高いため、スーパークラスの初期化子をオーバーライドする必要があります。そうしないと、スーパークラスの実装が呼び出されます。スーパークラスはクラスについて何も知らないため、インスタンスが正しく初期化されない可能性があります。

同じページで、次のテキストを見つけました。

インスタンス変数を宣言するすべてのオブジェクトは、初期化メソッドを実装する必要があります — デフォルトの set-everything-to-zero 初期化で十分でない限り。

私の質問は、クラス B が A から継承するクラス B で init メソッドをスキップした場合、B の継承されていないメンバー変数がゼロに設定されていることを信頼できますか?

4

2 に答える 2

2

私の質問は、クラスBがAから継承するクラスBのinitメソッドをスキップした場合、Bの非継承メンバー変数がゼロに設定されていることを信頼できますか?

Objective-Cは、新しいオブジェクトのすべてのivarをゼロに設定します

allocメソッドは、新しいオブジェクトのインスタンス変数にメモリを動的に割り当て、それらすべてを0に初期化します。つまり、新しいインスタンスをそのクラスに接続するisa変数を除きます。オブジェクトが有用であるためには、通常、より完全に初期化する必要があります。これがinitメソッドの機能です。

したがって、初期化する必要のあるivar /プロパティがない場合は、クラスの初期化メソッドの実装をスキップしてもかまいません。-initもちろん、スーパークラスがそれ自体を初期化する機会を持てるように、または他の初期化メソッドを呼び出して、新しいオブジェクトを初期化する必要があります。

于 2012-09-27T19:46:03.590 に答える
1

はい、クラス B の非継承メンバー変数はゼロになります。継承された変数には、クラス A の init メソッドで設定された値 (または設定されていない場合はゼロ) が含まれます。

于 2012-09-27T19:39:16.827 に答える