1

免責事項、私はObjective Cを初めて使用しますが、これが説明されていません。init を実装する 2 つの方法を見てきました。

- (id)init {

  if ([super init]) {
    return self;
  } else {
    return nill;
  }

}

- (id)init {
    if (self = [super init]) {
      // do your init business here
    } 
    return self;
}

だから私が持っているとしましょう:

myObj = [[MyObject alloc] init];

ここで、MyObject クラスは NSObject のサブクラスです。2 番目の例では、init は NSObject の初期化されたバージョンを返しませんか? だから myObj は...どうやってそれが何であるかを知るのでしょうか? MyObject ではなく NSObject だと思いませんか?

4

2 に答える 2

3

1) 最初のバージョンは間違っています。初期化時に別のオブジェクトを返すことができるため、常にイニシャライザselfによって返される値を割り当てる必要があります(これは珍しいことではありません)。2 番目のバージョンは、実際にはメソッドを実装するための「公式」の方法です。superinit<...>superinit<...>

2) 「MyObject ではなく NSObject だと思いませんか?」myObj「NSObject」のインスタンスであり、「MyObject」のインスタンスです。それが継承の全体的なポイントです。

于 2011-03-12T02:00:42.400 に答える
1

ボンネットの下で、それがどのように機能するかを知りたいだけです。

とてもシンプルです。これから作成するすべてのクラスの 99.9% は、何らかの形で継承されます。NSObjectイニシャライザでは、 の指定されたイニシャライザを呼び出しsuperて に割り当てることになっていselfます。最終的には、[super init]を呼び出し-[NSObject init]ます。 documentation によると、それは次のように実装されています。

- (id)init {
    return self;
}

したがって、技術的には、 から直接継承する場合NSObject、 の割り当てを行わなくても安全です。これは、これがself = [super init];: と同等であることを知っている (そして保証されている) ためです。self = self;これは無意味です。とにかく、一貫性を保つためにそのままにしておく必要があります。

しかし、継承チェーンのさらに下に降り始めると、特に不透明なクラス (つまり、.m ファイルを持たないクラス) から継承している場合は、怪しくなり始めます。指定された初期化子が次のようなクラスに遭遇する可能性があります。

- (id) initWithFoo:(id)aFoo {
  if ([aFoo isSuperFast]) {
    [self release];
    return [[SuperFastFooWrapper alloc] initWithFoo:aFoo];
  }
  self = [super init];
  if (self) {
    _foo = [aFoo retain];
  }
}

これはそれほど一般的ではありませんが、起こります。この場合、self( 、これの直前[self release]の呼び出しのバランスをとるために) を破棄し、代わりに別のオブジェクトを返します。alloc

于 2011-03-12T05:42:42.070 に答える