5

本のコード例では、init常に が定義されているようで、 がself存在できるかどうかを注意深くチェックするようになっています。

-(id) init {

    self = [super init];
    if (self) {
        // initialize
    }
    return self;
}

ただし、返されたときに、オブジェクトが存在できるかどうかをチェックするコードはまったくありません。しかし、それをチェックする必要があり、どのように処理できるのでしょうか? オブジェクトが存在できない場合、それはシステムのメモリが深刻に不足していることを意味し、エラー メッセージを表示することさえ不可能になるのでしょうか?

4

2 に答える 2

4

ただし、戻ったときに、オブジェクトが存在できるかどうかをチェックするコードはまったくありません。しかし、それをチェックする必要があり、どのように処理できるのでしょうか?

nil通常、が返されると、エラー処理はサブクラスによって無視されます。nil通常、が返されるときのエラー処理は呼び出し元に任されます。慣用句で示されているように-init

- (id)init {
  self = [super init];
  if (self) {
    // initialize
  }
  return self;
}

同様に、ベースが で再割り当てselfされるinitと、selfが再割り当てされます ( self = [super init];)。よく働く。

selfのイニシャライザの結果への割り当てに失敗した場合super、または のチェックに失敗した場合はnil、ぶら下がっている/割り当て解除されたポインタ ( EXC_BAD_ACCESS) を保持している可能性があり、ivar を適切に初期化できない可能性があります (効果的にそれらを検出されなかった場合は別のリージョンEXC_BAD_ACCESS)。

2 つのケースの詳細:

自分自身を割り当てられませんでした

- (id)init {
  [super init];
  if (self) {
    // self was not reassigned. if super returned an object other
    // than self, then our ivar would be freed, reused, or sitting
    // in an autorelease pool, and the returned instance's ivar
    // would not be assigned -- we wouldn't know the address.
    ivar = 1;
  }
  return self;
}

nil のチェックに失敗

- (id)init {
  self = [super init];
  // super returned nil. ivar is an invalid region:
  ivar = 1;
  return self;
}

はい、私はこれらの両方を見てきました。


オブジェクトが存在できない場合、それはシステムのメモリが深刻に不足していることを意味し、エラー メッセージを表示することさえ不可能になるのでしょうか?

全くない。多くのイニシャライザnilは、「このコンテキストでは実行できません」と言うか、単純なパラメータ エラーがある場合に戻ります。

于 2012-04-27T23:04:28.000 に答える
3

これは、システムのメモリが深刻に不足していることを意味しますか

いいえ。メモリの割り当てに失敗すると、通常、-init ではなく +alloc が失敗します。

実際には、引数のない init メソッドが失敗することは非常にまれです。一般に、無効な引数を渡した場合、init メソッドは nil を返すことができます。たとえば、NSString の -initWithContentsOfFile: は、初期化に使用するはずだったファイル パスの内容の読み込みに失敗した場合、nil を返すことができます。

初期化が失敗する可能性が高いことを認識している場合は、おそらくチェックしたいものです。そうでない場合は、オブジェクトの使用を続行する必要があります。

于 2012-04-27T22:37:48.210 に答える