Я должен всегда выпускать сам для неудавшихся init методов?

Я должен всегда выпускать сам, когда существует отказ внутри init, или я должен только сделать так, если я инициализировал переменные экземпляра сначала?

Другими словами, действительно ли этот шаблон допустим? Существует ли время, когда я не должен выпускать сам в init методе, или я должен предположить, что, если поток управления входит, init, сам имеет, по крайней мере, сохранить количество 1?

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

 //do some init stuff
 if (somethingFailed)
 {
  [self release];
  return nil;
 }
 return self;
}
11
задан leo 18 March 2010 в 05:22
поделиться

1 ответ

Если какая-то проверка, которая нужна в вашем методе инициализации, не прошла, то да, вы должны освободить self. Однако обратите внимание, что если [super init] возвращает nil, то не имеет смысла посылать release на self, поскольку self является nil. На самом деле Apple не одобряет это:

Вы должны вызывать [self release] только в точке отказа. Если вы получаете nil обратно от вызова инициализатора суперкласса, вы не должны также вызывать release.

Пример:

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

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

   return self;
}

Также смотрите документацию Mac Dev Center по Handling Initialization Failure

17
ответ дан 3 December 2019 в 07:12
поделиться