Cuando se crea una clase personalizada en Objective C, ¿cuándo y cómo se llama el método dealloc
? ¿Es algo que debo implementar de alguna manera en mi clase?¿Quién llama al método dealloc y cuándo está en Objective C?
Respuesta
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];
}
}
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.
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.
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.
- 1. ¿cuándo se llama el método dealloc?
- 2. Encuentra quién llama al método
- 3. variables de clase objetivo-c: ¿cuándo se llama a dealloc?
- 4. ¿Quién llamará al método principal en el objetivo c
- 5. ¿Cuándo se llama al método ConvertBack?
- 6. El método Objective-C no se llama
- 7. ¿Cuándo se llama al método IEnumerator.Reset()?
- 8. ¿Quién está llamando al método paintComponent() en mi clase?
- 9. diferencia entre la liberación y dealloc en Objective-C
- 10. ¿Cuándo llama al método super en viewWillAppear, viewDidDisappear, etc ...?
- 11. ¿Se llama a dealloc en iPhone?
- 12. ¿Cuándo se llama al método onCreate() de la aplicación?
- 13. ¿Cuándo se llama al método getView() de ListView?
- 14. Destructor en Objective-C++
- 15. Objective-C: Volviendo al método BOOL
- 16. Para Objective-C ... Puntero al método
- 17. ¿Cuándo se llama al constructor?
- 18. ¿Quién y cuándo debe llamar al método confirmCredentials de la clase AbstractAccountAuthenticator-based?
- 19. Desbloqueo personalizado y ARC (Objective-C)
- 20. UIViewController & UIview dealloc no se llama
- 21. ¿Cuándo se llama al Constructor en Java?
- 22. ¿Cuándo debería usar assign en Objective c?
- 23. ¿Cuándo se llama el método layoutSubviews?
- 24. NSTimer no llama al método
- 25. Cuándo usar primitivas en Objective-C?
- 26. Quién llama a la función principal en C
- 27. Constructor de bases en C# - ¿A quién se llama primero?
- 28. Objective-C - Cuándo utilizar 'auto'
- 29. ¿Cuándo se llama un destructor de C++?
- 30. ¿Qué es dealloc en el objetivo C
Espero que este método cuerpo debe estar bajo 'liberación', en lugar de 'retener' – Saran
@saran, tienes toda la razón. Mi error tonto; gracias por atraparlo – Caleb
muy buena respuesta. Dar una respuesta arriba, pero creo que su respuesta es la mejor en la práctica. – PJR