Должен ли я всегда выпускать себя для неудачных методов инициализации? - PullRequest
11 голосов
/ 18 марта 2010

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

Другими словами, действителен ли этот шаблон? Есть ли время, когда я не должен выпускать self внутри метода init, или я должен предположить, что если поток управления входит в 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;
}

1 Ответ

17 голосов
/ 18 марта 2010

Если какая-то проверка, которая вам нужна в вашем методе инициализации, не удалась, тогда да, вы должны выпустить self. Однако обратите внимание, что если [super init] возвращает nil, нет смысла отправлять релиз на 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 по Обработка ошибок инициализации

...