2011-08-17 12 views

Respuesta

16

Nunca envía un mensaje dealloc directamente. En cambio, el método dealloc de un objeto se invoca indirectamente a través del método de protocolo de lanzamiento NSObject (si el mensaje de liberación da como resultado que el recuento de retención del receptor se convierta en 0). Consulte la Guía de programación de administración de memoria para obtener más detalles sobre el uso de estos métodos.

Las subclases deben implementar sus propias versiones de dealloc para permitir la liberación de cualquier memoria adicional consumida por el objeto, como el almacenamiento asignado dinámicamente para los datos o las variables de instancia del objeto propiedad del objeto desasignado. Después de realizar la cancelación de asignación específica de clase, el método subclase debe incorporar versiones superclase de dealloc a través de un mensaje a súper:

Importante: Tenga en cuenta que cuando una aplicación termina, los objetos pueden no ser enviados un mensaje dealloc desde la memoria del proceso es se borra automáticamente al salir; es más eficiente simplemente para permitir que el sistema operativo limpie los recursos que para invocar todos los métodos de administración de memoria. Por esta y otras razones, no se debe administrar los recursos escasos en dealloc

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc]; 
    } 
    } 
1

El tiempo de ejecución lo hará por usted cuando el objeto ya no se necesite (que el tiempo de ejecución también decide). Solo asegúrate de retener y liberar correctamente. No llame a dealloc en otros objetos.

2

dealloc se llama como resultado de memory management. Una vez que los objetos "retainCount" alcanzan 0, se envía automáticamente un mensaje dealloc a ese objeto.

Nunca debe llamar a dealloc en objetos a menos que sea una llamada al [super dealloc]; al final de un dealloc anulado.

-(void)dealloc 
{ 
    [ivar release]; //Release any retained variables before super dealloc 

    [super dealloc]; //Only place in your code you should ever call dealloc 
} 

Y de acuerdo con la -[NSObject dealloc] discussion

Nunca enviar un mensaje directamente dealloc. En su lugar, el método dealloc de un objeto se invoca indirectamente a través del método de protocolo de publicación NSObject (si el mensaje de liberación da como resultado el recuento de retención del receptor que se convierte en 0). Consulte Memory Management Programming Guide para más detalles sobre el uso de estos métodos.

5

Imagínese que -release se implementa en NSObject así:

- (void)release 
{ 
    _retainCount--; 
    if (_retainCount == 0) { 
     [self dealloc] 
    } 
} 

Estoy seguro de que es un poco más complicado que eso, pero la respuesta a su pregunta es que el objeto en sí llamará -dealloc cuando su conteo de retención cae a cero. Sin embargo, su clase personalizada heredará este comportamiento de NSObject. Nunca necesitarás llamar -dealloc tú mismo en el código que escribes; siempre sucederá automáticamente cuando el objeto se haya lanzado correctamente.

+0

Espero que este método cuerpo debe estar bajo 'liberación', en lugar de 'retener' – Saran

+0

@saran, tienes toda la razón. Mi error tonto; gracias por atraparlo – Caleb

+1

muy buena respuesta. Dar una respuesta arriba, pero creo que su respuesta es la mejor en la práctica. – PJR

Cuestiones relacionadas