2009-02-18 16 views
39

Cuando deallocing un refrence que he visto release y dealloc siendo utilizado por ejemplodiferencia entre la liberación y dealloc en Objective-C

-(void)dealloc 
{ 
    [foo release]; 
    [nar dealloc]; 

    [super dealloc]; 
} 

Mi pregunta es cuando es release a utilizar y cuando es dealloc para ser utilizado ?

Gracias

+0

Si llama a '[self dealloc]' dentro de la definición '-dealloc', se producirá una recursión. ¿Estás seguro de que el código es correcto? – codelogic

Respuesta

53

Nunca llaman dealloc excepto como [super dealloc] al final del método dealloc de su clase. El método release renuncia a la propiedad de un objeto. Cuando un objeto Cocoa ya no tiene ningún propietario, puede ser desasignado, en cuyo caso se enviará automáticamente un mensaje de dealloc.

Si va a programar Cocoa, debe leer el Memory Management Guidelines. Es increíblemente simple una vez que superas la barrera inicial, y si no entiendes lo que hay en ese documento, tendrás muchos errores sutiles.

+0

¿Qué hay de [self dealloc] como he mostrado en el ejemplo, ¿realmente hay una necesidad para eso? – hhafez

+6

No solo es innecesario, llamar [self dealloc] en su método dealloc crea un ciclo infinito. – Chuck

2

La instrucción dealloc en su ejemplo se invoca cuando el recuento de retención del objeto se vuelve cero (a través de un objeto que le envía un mensaje de liberación).

Como ya no es necesario, se limpia enviando un mensaje release a los objetos a los que se aferra.

1

Nunca se supone que debes llamar a dealloc explícitamente (a menos que sea [super dealloc] dentro del método dealloc, pero esa es la única excepción). Objective-C maneja la administración de la memoria a través del conteo de referencias, por lo que se supone que simplemente debes unir tus allocs/retains con lanzamientos/autorreleases y dejar que el objeto se deconstruya.