La forma estándar para crear un objeto en Objective-C se parece a esto:¿La inicialización del objeto estándar en Objective-C no genera fugas de memoria?
MyClass* object = [[MyClass alloc] init];
La implementación estándar de init método MiClase 's sería algo como esto:
-(id) init
{
self = [super init];
if(self) { /* initialize */ }
return self;
}
Aparte de algunos cambios de sintaxis, y la exclusión de los métodos de fábrica, esa parece ser la forma recomendada de escribir un método init y usarlo.
Según tengo entendido, el propósito de self = [super init]; es para manejar el caso donde [super init] falla. Pero si falla, y devuelve nulo, ¿no habría una pérdida de memoria? La razón es que MiClase 's init volverá nula, objeto será igual a cero, no habrá más punteros que hacen referencia al objeto asignado con [MiClase alloc], y por lo tanto no hay manera de liberarlo.
Estas son las dos soluciones que se me ocurren, pero no he visto ninguna en la práctica habitual.
Tras una llamada a alloc , comprobar los resultados antes de llamar init:
MyClass* object = [MyClass alloc];
if(object == nil) { /*handle the error */ }
else { object = [object init]; }
O, si [súper init] falla, suelte el recuerdo. Algo como esto:
-(id) init
{
id temp = [super init];
if(!temp) { [self release]; }
self = temp;
if(self) { /* initialize */ }
return self;
}
¿Me equivoco en ese razonamiento? Se podría argumentar que [super init] es poco probable que falle, pero ¿por qué asignar los resultados de la misma a auto y comprobar si no? Estaría feliz de ver alguna aclaración.