Скажем, я создаю новый класс для 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 ()?
Да, вы должны освободиться и затем вернуть ноль
.
[self release];
self = nil;
См. Issues with Initializers in the Concepts in Objective-C Programming guide.
Нужно очистить все, что нужно, а затем установить самоназвание на nil
. На портале Apple Dev Portal есть статья:
Я только что пытался. -dealloc
вызывается из-за [самоотвода]
, так что myObject
не нужно будет освобождать в initWithSomeObject
. Чтобы быть уверенным, вы можете переместить myObject = [someObject retain];
(я предпочитаю этот стиль в случае, если -retain
по какой-то причине может не сработать) ниже вызова, который может не сработать (если это возможно).