2011-04-12 20 views
5

¿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

10

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?

0

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í.

-1

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.

+0

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

Cuestiones relacionadas