Как мне обработать ошибку в init: метод в Objective-C? - PullRequest
24 голосов
/ 07 января 2010

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

- (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 ()?

Ответы [ 3 ]

26 голосов
/ 07 января 2010

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

[self release];
self = nil;

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

3 голосов
/ 07 января 2010

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

Ссылка

1 голос
/ 07 января 2010

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

...