iphone - create - ¿Cómo debo manejar una falla en un método init: en Objective-C?
uiimageview set image swift (3)
Acabo de intentarlo. -dealloc
se llama debido a [self release]
, por lo que myObject
no tendría que ser lanzado en initWithSomeObject
. Para estar seguro, puede mover myObject = [someObject retain];
(Prefiero ese estilo en caso de que la -retain
pueda fallar por algún motivo) debajo de la llamada que puede fallar (si es posible).
Digamos que estoy construyendo una nueva clase para el iPhone en Objective-C. En uno de mis métodos de inicio quiero asignar manualmente algo de memoria. Por lo tanto, podría tener algo como esto:
- (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;
}
Ahora, suponiendo que el calloc () pueda fallar, y que no asignar memoria sea catastrófico para mi objeto, ¿qué debo hacer dentro del if-body para limpiar correctamente? ¿Hay algún idioma o patrón de Objective-C que deba usar?
Edición: Incluí el código publicado por Rob Napier. Pero, todavía tengo que liberar miObjeto, ¿verdad? ¿O el código agregado de alguna manera desencadena dealloc ()?
Debe limpiar todo lo que necesite y luego establecer la auto referencia en nil
. Apple Dev Portal tiene un artículo:
Sí, deberías liberarte y luego regresar.
[self release];
self = nil;
Consulte Problemas con los inicializadores en la guía de programación Conceptos en Objective-C.