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

Как я должен обрабатывать сбой в методе init: в Objective-C?

Скажем, я создаю новый класс для iPhone в Objective-C. В одном из моих методов init я хочу вручную выделить некоторую память. Итак, у меня может быть что-то вроде этого:

- (id)initWithSomeObject:(SomeObject *)someObject {
  self = [super init];
  if (self != nil) {
    myObject = someObject;
    [myObject retain];
    if ( (memory = calloc(1, sizeof(SomeStruct)) == NULL) {
      // What should I do here to clean up
      [self release];
      self = nil;
    }
  }
  return self;
}

Теперь, если предположить, что calloc() может выйти из строя, и что неспособность выделить память катастрофична для моего объекта, что я должен делать внутри if-body для правильной очистки? Есть ли Objective-C идиома или шаблон, который я должен использовать?

Изменить: я включил код, написанный Робом Напиром. Но мне еще нужно выпустить myObject, верно? Или добавленный код каким-то образом вызывает dealloc()?

4b9b3361

Ответ 1

Да, вы должны освободить себя, а затем вернуть nil.

[self release];
self = nil;

Смотрите Проблемы с инициализаторами в концепциях в Objective-C Руководстве по программированию.

Ответ 2

Вам нужно очистить все, что вам нужно, а затем установить собственную ссылку на nil. В Apple Dev Portal есть статья:

Ссылка

Ответ 3

Я просто попробовал. -dealloc вызывается из-за [self release], поэтому myObject не нужно освобождать в initWithSomeObject. Конечно, вы можете переместить myObject = [someObject retain]; (я предпочитаю, чтобы стиль в случае, если -retain по какой-то причине может выйти из строя) под вызовом, который может выйти из строя (если это возможно).