Подтвердить что ты не робот

[self release], [self dealloc] или [super dealloc] в методах init?

Я только что читал о том, как правильно сбой в методе init, и документы, похоже, не согласны друг с другом. Рекомендуется рекомендовать исключение, в то время как другие рекомендуют очищать и возвращать нуль. Какая здесь самая лучшая практика?

4b9b3361

Ответ 1

Я считаю, что общепринятая практика заключается в том, чтобы вернуть нуль при неудаче. Но вы хотите освободить себя, чтобы избежать утечки:

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

Ответ 2

Были рассмотрены правильные решения (исключения и/или [self release]; return nil;), я рассмотрю неправильные решения.

Не отправляйте dealloc напрямую. Это release задание. (И если ваш код работает под GC, dealloc неприменим, и я мог только размышлять над тем, какие вызовы вызовут его вызовы.)

Дважды не используйте super, чтобы отправить его напрямую. Это пропустит вашу собственную реализацию dealloc.

Ответ 3

Cocoa Философия исключений заключается в том, что их нужно бросать только в ситуациях, которые являются ошибками программиста, например, передавая незаконный аргумент методу. Если что-то пошло не так, метод должен просто вернуть NO или nil и, надеюсь, сообщить подробности через параметр NSError ** "out".

Это включает в себя методы -init. Если ситуация с ошибкой - это то, что может быть законно достигнуто в готовом продукте, тогда метод должен освободить себя (чтобы избежать утечки) и вернуть нуль.

Ответ 4

Метод, который я всегда использовал, - это очистка и возврат нулевого значения. Три метода, которые вы указываете в заголовке вопроса, могут привести к повышению segfaults в иерархии вызовов, тогда как возврат nil не будет. Я считаю, что сами Apple заявляют, что возвращаются к неудаче. Где вы находите расхождения?