¿Cuándo se llama exactamente el método dealloc
? Descubrí que (en muchos ejemplos) muchas de las variables NS se liberan en el método en el que se crean las instancias, pero al sintetizar un componente, ubican el lanzamiento en el método dealloc.¿cuándo se llama el método dealloc?
Respuesta
El documento Apple reference indica claramente Los mensajes subsiguientes al receptor pueden generar un error que indica que se envió un mensaje a un objeto desasignado (siempre que la memoria desasignada no se haya reutilizado aún).
Usted 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: Nota que cuando una aplicación termina, los objetos pueden no ser enviados un mensaje dealloc desde la memoria del proceso se borra automáticamente al salir; es más eficiente que 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
Otra cuestión de forma iPhone - when is dealloc for a viewcontroller called?
Cuando carga el archivo de punta, debe haber un propietario que es un objeto que existe en la aplicación. Si abre el archivo de punta en constructor de interfaz, verá un icono de proxy que representa el propietario del archivo de punta. Puede establecer conexiones pero las conexiones no se establecen HASTA que se cargue el archivo de plumilla y especifica quién es realmente el .
De todos modos, puede tener una toma (por ejemplo, una i-var) conectada al objeto de UI de nivel superior en el archivo de plumillas, normalmente la ventana. Cuando carga el archivo de plumilla y especifica al propietario que i-var apuntará ahora al objeto de interfaz de usuario . Digamos que es una ventana. Finalmente, cuando decida eliminar los objetos de la interfaz de usuario, simplemente libere al propietario y si el alcanza un recuento retenido de cero, se llamará al método dealloc. Luego, el método dealloc en el propietario debería liberar su i-vars (variables de instancia). Digamos que la i-var que conectó a la ventana se llama ventana. Entonces debería tener algo como esto:
- (void) dealloc { [versión de ventana]; [super dealloc]; }
Esto debería hacer que la ventana llegue a cero. A continuación, se debe llamar al dealloc de la ventana y posteriormente liberará todas las reservas en las subvistas, y las subvistas llegarán a un conteo retenido de cero y posteriormente liberarán todas las retenciones en sus subvistas, y así sucesivamente hasta que todo está desasignado
Ha pasado un tiempo desde que hice la programación de AppKit (Cocoa) pero creo que esto sigue siendo cierto.
Hay una solicitud de llamada Omni OmniObjectAlloc o algo como la que debe ser muy útiles para examinar su aplicación y averiguar si todo se está dealloced. Utilicé ObjectAlloc de NeXT/Apple, pero no sé si todavía lo proporcionan. Busque , me imagino que todavía está allí.
Su basada en el alcance del objeto que en realidad se crea o se conserve. Cuando el contador de retención vuelva a 1, el método dealloc será llamado por sí mismo. Esto solo es aplicable para MRC, no en ARC.
Una buena nota es hacer un seguimiento de los objetos que crea, no permita que se filtren en sus implementaciones.
- 1. variables de clase objetivo-c: ¿cuándo se llama a dealloc?
- 2. ¿Cuándo se llama el método layoutSubviews?
- 3. UIViewController & UIview dealloc no se llama
- 4. ¿Cuándo se llama al método ConvertBack?
- 5. ¿Cuándo se llama al método IEnumerator.Reset()?
- 6. ¿Se llama a dealloc en iPhone?
- 7. ¿Quién llama al método dealloc y cuándo está en Objective C?
- 8. ¿Cuándo se llama el método de finalización en la unidad?
- 9. Eliminar, ¿cuándo se llama?
- 10. View.onDraw() --- ¿cuándo se llama?
- 11. ¿Cuándo se llama a ServiceConnection.onServiceDisconnected()?
- 12. iPhone - ¿cuándo se llama a un control de vista?
- 13. ¿Cuándo se llama al método getView() de ListView?
- 14. ¿Cuándo se llama al método onCreate() de la aplicación?
- 15. Dealloc no se llama en la aplicación ARC
- 16. ¿Cuándo se llama a viewDidLoad?
- 17. ¿Cuándo se llama al constructor?
- 18. ¿Cuándo se llama a initWithCoder?
- 19. ¿Cuándo se llama a didRegisterForRemoteNotificationsWithDeviceToken?
- 20. ¿Cuándo se llama a 'drawRect'?
- 21. ¿Cuándo se llama a OnValidate en Linq?
- 22. UINavigationController: ¿Cuándo recibe una vista presionada el mensaje Dealloc?
- 23. ¿Cuándo se llama un destructor de C++?
- 24. NSFilePresenter -presentedSubitemDidAppearAtURL: el método nunca se llama
- 25. El método "clickedButtonAtIndex:" delegado no se llama
- 26. El método Objective-C no se llama
- 27. ¿Qué método de actividad se llama primero?
- 28. ASP MVC: ¿Cuándo se llama IController Dispose()?
- 29. ¿Cuándo se llama un cuerpo onLoad?
- 30. Método de ejecución (mágico) cuando se llama el método existente
se llama a 'dealloc' cuando el recuento de retenciones se habría reducido a 0. Dado que disminuir el RC a 0 sería inútil, eso no se hace. Pero el objeto todavía está muy vivo cuando el "contador de retención vuelve a ser 1". – bbum