Как должен я обрабатывать отказ в 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 () мог перестать работать, и что отказ выделить память является катастрофическим для моего объекта, что я должен сделать в если-теле для чистки правильно? Существует ли идиома Objective C или шаблон, который я должен использовать?

Править: Я включал код, отправленный Rob Napier. Но, я все еще должен выпустить myObject, правильно? Или добавленное кодирует так или иначе триггер dealloc ()?

24
задан Rob Jones 6 January 2010 в 22:37
поделиться

3 ответа

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

[self release];
self = nil;

См. Issues with Initializers in the Concepts in Objective-C Programming guide.

26
ответ дан 29 November 2019 в 00:04
поделиться

Нужно очистить все, что нужно, а затем установить самоназвание на nil . На портале Apple Dev Portal есть статья:

Link

3
ответ дан 29 November 2019 в 00:04
поделиться

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

1
ответ дан 29 November 2019 в 00:04
поделиться