Как вы предотвращаете утечки при создании исключения в init? - PullRequest
2 голосов
/ 15 февраля 2011

Вот ситуация.Допустим, у меня есть класс под названием MYFoo.Вот его инициализатор:

-init
{
  self = [super init];
  if (self)
  {
    // during initialization, something goes wrong and an exception is raised
    [NSException raise ...];
  }
  return self;
}

Теперь где-то еще я хочу использовать объект MYFoo, поэтому я использую общий шаблон:

MYFoo *foo = [[[MYFoo alloc] init] autorelease];

Но что произойдет, даже еслиесть вторая попытка / уловка, будет выделен объект MYFoo, будет сгенерировано исключение, пропущено автоматическое высвобождение, и неинициализированный объект MYFoo утечет.утечка?

Ответы [ 2 ]

8 голосов
/ 15 февраля 2011

В Apple Docs говорят, что лучшая практика - не бросать.

Ошибка инициализации обработки

В общем, если есть проблема во время метода инициализации вы должен позвонить [самоотпуск] и вернуться ноль.

Если вам нужно знать, что произошло, вы можете init обьект и иметь какое-то внутреннее состояние, которое проверяется вызывающей стороной, чтобы убедиться, что объект можно использовать.

1 голос
/ 15 февраля 2011

ongle 100% верно. Но если вам нужно сгенерировать исключение и вы хотите его где-то перехватить (в отличие от простого выхода из приложения), вы можете заключить инициализацию в @try { ... } @finally { ... }

-init
{
   self = [super init];
   if (self)
   {
       @try
       { 
           // during initialization, something goes wrong and an exception is raised
           @throw...
       }
       @finally
       {
           [self release]; 
       }
   }
   return self;
}

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

...