Предположим, я создаю новый класс для iPhone в Objective-C. В одном из моих методов init я хочу вручную выделить некоторую память. Таким образом, я мог бы что-то вроде этого:Как я должен обрабатывать сбой в методе init: в 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() может потерпеть неудачу, и что не в состоянии выделить память катастрофична для моего объекта, что я должен делать внутри, если орган, чтобы очистить правильно? Есть ли идиома Objective-C или шаблон, который я должен использовать?
Редактировать: Я включил код, отправленный Роба Напиром. Но мне еще нужно выпустить myObject, верно? Или добавленный код каким-то образом вызывает dealloc()?
Не беспокойтесь о том, запускает ли он dealloc(). Да, но дело не в этом. Дело в том, что [self release] уравновешивает предыдущий вызов + alloc, поэтому все ваши необходимые релизы были выполнены, и система теперь позаботится об освобождении в соответствующее время. В большинстве случаев «подходящее время» возможно, как только вызывается [self release], но это может быть позже, если есть какие-либо отложенные автореализаторы. Но приведенный выше код верен, и больше ничего не требуется. –
В качестве примечания: я понимаю, что calloc/malloc никогда не вернет NULL, система просто убьет ваше приложение, когда у вас закончится или будет недостаточно памяти. Я предполагаю, что Apple подумал, что это было проще сделать, а затем сбой приложения с непроверенных указателей NULL/nil. –