0

目的の C で指定された初期化子を作成する理由について混乱しています。また、スーパークラスの init メソッドを呼び出して、スーパークラスの実装をオーバーライドしますか?

そのようなメソッドを作成する理由を説明できる人はいますか?

例えば、

 -(id)initWithCardCount:(NSUInteger)count usingDeck:(Deck *)deck // Designated Initialiser
   {
    self = [super init]; 

    if(self)
    {
        for (int i = 0; i < count; i++)
        {
            Card *card = [deck drawRandomCard];

            if(!card)
            {
                self = nil;
            }else
            {
                self.cards[i] = card;

            }

        }
    }
    return self;
}
4

2 に答える 2

2

ほとんどの Objective-C オブジェクトは、最終的に NSObject から派生しますが、初期化しようとしているオブジェクトは、追加のオブジェクトからサブクラス化される可能性があります。たとえば、サブクラス化された FarhanViewController は、UIResponder からサブクラス化され、最終的に NSObject からサブクラス化される UIViewController からサブクラス化されます。

オブジェクトの init メソッド内で" " を呼び出すと[super init]、基本クラスは、そのジョブを適切に実行するために設定する必要がある他のすべてのものを初期化できます。

また、この Apple のドキュメント「複数の初期化子と指定された初期化子」で、さらに役立つ情報を見つけることができます。

于 2013-09-15T09:44:06.463 に答える
0

これの短いバージョンは、指定された初期化子がないと、クラスを正しくサブクラス化する方法がわからないということです。

Fruitクラスを定義するとします。私はApple.

init独自のメソッドで何を呼び出す必要がありますか? 電話するべきinitWithTastiness:ですか?ただプレーンinit?何も思いつきません。

指定された初期化子を使用すると、サブクラスは new を作成するためにやりたいことを正確に認識し、Fruit初期化なしでクラスが (有効に) 呼び出されることはなく、不変条件などを保持できることがわかります。

于 2013-09-15T09:46:22.873 に答える