3

Cocoa では、スーパークラスの指定された初期化子を常に呼び出すことをお勧めします。オブジェクトが init で初期化されていなくても、オブジェクトの初期化中に init が常に呼び出されると仮定しても安全ですか?

たとえば、、またはNSThingieのように初期化できるクラスがあるとします。init をオーバーライドすると、初期化中のある時点で呼び出されると想定できますか?[[NSThingie alloc] initWithFoo: foo][[NSThingie alloc] initWithFoo: foo andBar: bar]


編集

たぶん、私の最初の質問はあまりうまく表現されていませんでした。init をオーバーライドすると、スーパークラスの init が呼び出されないことがわかっているため、明示的に init を呼び出す必要があります。私が疑問に思っているのは、Apple フレームワークで[NSObject init]常に呼び出されるかどうかです。のような Apple オブジェクトを初期化[[NSAppleClass alloc] initWithSomething: something]すると、NSObject の init が最終的に NSAppleClass の初期化中に呼び出されると想定できますか?

4

3 に答える 3

4

短い答え: いいえ

init使用しているクラスの正しいメソッドをオーバーライドしていることを確認する必要があります

たとえばUIView、init メソッドがinitWithFrame:あり、その非常に基本的な実装は次のようになります。

- (id)initWithFrame:(CGRect)frame
{
    self = [super init]; //calls init because UIResponder has no custom init methods
    if (self){
        self.frame = frame;
    }
    return self;
}

initはスーパークラスで呼び出されUIViewますが、では呼び出されないため、オーバーライドinitinitWithFrame:て初期化コードを呼び出さない場合、実行されることはありません

于 2012-08-13T13:50:33.323 に答える
1

init をオーバーライドすると、初期化中のある時点で呼び出されると想定できますか?

メソッドをオーバーライドする場合init、指定されたイニシャライザを呼び出す責任があります。サブクラス化するクラスの正しい初期化子を呼び出すのは、開発者の責任です。指定された初期化子を呼び出す理由は、クラスが意図した状態で構築されていることを確認するためです。正しい初期化子を呼び出さないか、初期化子をまったく呼び出さないと、未定義/望ましくない動作が発生する可能性があります。

于 2012-08-13T13:46:07.583 に答える
0


はい、NSObjectクラスで定義されたinitメソッドは初期化を行わないため、「init」デフォルトコンストラクターは特定の処理を行いません。それは単に自己を返します。

于 2012-08-13T13:48:44.247 に答える