2010-11-03 5 views
6

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.

Respuesta

6

Si [super init] quiere devolver nada, también debe llamar al release en uno mismo.

2

Un método init debería deshacerse del objeto si decide abortar y devolver nil.

Sin embargo, eso es exactamente lo que cubre el if (self). El self = [super init] cumple otra función: un método init puede devolver algo que no sea el objeto al que se envió el mensaje. Para un ejemplo de la vida real, [NSArray alloc] devuelve un objeto ficticio, y los diversos métodos init… de ese objeto devuelven la matriz real.