11

init内で障害が発生した場合は常に自分自身を解放する必要がありますか、それとも最初にインスタンス変数を初期化した場合にのみ解放する必要がありますか?

言い換えれば、このパターンは有効ですか?initメソッド内でselfを解放するべきではない場合がありますか、または制御フローがinitに入った場合、selfの保持カウントは少なくとも1であると想定する必要がありますか?

- (id)init
{
 if ((self = [super init]) == nil)
 {
  [self release];
  return nil;
 }

 //do some init stuff
 if (somethingFailed)
 {
  [self release];
  return nil;
 }
 return self;
}
4

1 に答える 1

17

初期化メソッドで必要なチェックが失敗した場合は、はい、リリースする必要がありますself。ただし、[super init]returnsの場合、リリースをそのまま送信しても意味がnilないことに注意してください。これは実際にはAppleによって眉をひそめています:selfselfnil

[self release]失敗した時点でのみ電話をかける必要があります。nilスーパークラスの初期化子の呼び出しから戻った場合は、も呼び出さないでくださいrelease

例:

- (id)init
{
   self = [super init];
   if(self) {
       // do some init stuff

       if (somethingFailed)
       {
          [self release]
          self = nil;
       }
   }

   return self;
}

初期化の失敗の処理に関するMacDevCenterのドキュメントも参照してください。

于 2010-03-18T05:28:33.787 に答える