13

本の中で、サブクラスがスーパークラスのメソッドをオーバーライドしている場合、

self = [super init];

まず、これはサブクラスのinitメソッドで実行されることになっていますか?

第二に、なぜ電話はただではないのだろうか

[super init];

?つまり、呼び出し時にinit、メモリはすでに割り当てられています(サブクラスの名前はどこにあるallocと思います。したがって、メンバー変数を初期化するために呼び出すだけではいけませんか?の戻り値を取得して割り当てる必要があるのはなぜですか?つまり、呼び出す前に、有効なメモリ割り当てチャックを指している必要があります...では、なぜ自分自身に何かを再度割り当てるのですか?[Foobar alloc]Foobar[super init]initself[super init]self

(割り当てる場合、の既存の値[super init]を返すだけではありませんか?)self

4

4 に答える 4

11

では、なぜ[super init]から返された値を自分自身に割り当てるのでしょうか?典型的な初期化メソッドを見てみましょう。

 - (id)initWithString:(NSString *)aString {
     self = [super init];
     if (self)
     {
         instanceString = [aString retain];
     }
     return self; }

ここで[superinit]を自分自身に割り当てるのはなぜですか?

教科書の理由は、[superinit]が次の3つのいずれかを実行できるためです。

  1. 継承されたインスタンス値が初期化された状態で、自身のレシーバーを返します(セルフポインターは変更されません)。
  2. 継承されたインスタンス値が初期化された別のオブジェクトを返します。
  3. 失敗を示すnilを返します。

最初のケースでは、割り当ては自分自身に影響を与えず、instanceStringは元のオブジェクトでオンに設定されます(行instanceString = [aString hold];メソッドの最初の行である可能性があり、結果は同じになります)。

3番目のケースでは、初期化が失敗しました。selfはnilに設定され、それ以上のアクションは実行されず、nilが返されます。

自己に割り当てる理由は、2番目のケースに関連しています。返されたオブジェクトが異なる場合は、次のようにします。

instanceString = [aString retain]; which gets converted to

self->instanceString = [aString retain]; to act on the correct value,

したがって、この新しいオブジェクトを指すようにselfの値を変更する必要があります。

これが役立つことを願っています...

愛をこめてココアから

于 2012-04-13T11:24:09.220 に答える
3

から異なるオブジェクトを返す典型的な例は-init、クラスクラスターの実装です。これは、異なるストレージまたはアルゴリズムを提供する複数の具象実装者との抽象的なインターフェイスです。+[NSString alloc]のインスタンスを返しますNSPlaceholderString。プレースホルダーインスタンスのイニシャライザーはパラメーターを検査し、プレースホルダー文字列を解放して、具象NSStringサブクラスの初期化されたインスタンスを返します。

于 2012-04-13T11:43:09.347 に答える
2

スーパークラスがオブジェクトを適切に初期化できないと判断し、失敗としてnilを返す可能性があります。自分自身にnilを割り当てない場合、親クラスがオブジェクトを正しく初期化したという仮定の下で、initメソッドが続行されます。

必要に応じて、親クラスが完全に異なるオブジェクトを返すことも可能です。

于 2012-04-13T11:23:43.927 に答える
2

オブジェクトがすでに割り当てられており、自己がメモリを指していることを理解します。

これで、[superinit]が初期化部分を実行します。

1)初期化が成功した場合、自己は初期化前に同じオブジェクトを指します

2)初期化が失敗した場合、init関数はnilおよびself=nilを返します。これで、オブジェクトが初期化されているかどうかを確認できます。初期化されている場合は、このコードで魔法をかけます

 if(self = [super init]){
  // do our magic
 }

ITは、imageViewを使用するのと同じように、通常は使用します

UIImageView imgView = [[UIImageView alloc] init];

imgViewは、allocとinitの両方が成功した場合にのみ、nil以外の値になります。

于 2012-04-13T11:31:07.767 に答える