2009-10-07 9 views
7

Hay muchos objetos en cada aplicación de iPhone que vivirán para siempre hasta que la aplicación muera. Ellos son: delegado de aplicación, ventana, controlador de vista principal, puede ser controlador de navegación o pestañas, todos los objetos dentro de ellos. ¿Por qué demonios debería liberarlos justo antes de dejar de gastar preciosos ciclos de CPU? Por lo que yo entiendo, el proceso de las aplicaciones se terminará, por lo que es un montón, constante o no se habrá ido también.¿Por qué debería liberar (y por lo tanto desmantelar) los objetos justo antes de cerrar la aplicación?

¿Por qué debería lanzarlos? Los manuales de desarrollo de Apple insisten en ello como en el siguiente ejemplo de código (desde iPhone Development Guide). Es solo el primer lugar que encontré buscando por palabra dealloc en la biblioteca.

@implementation HelloWorldAppDelegate 
@synthesize window; 

- (void)applicationDidFinishLaunching:(UIApplication *)application { 

    // Override point for customization after app launch 
    MyView *view = [[MyView alloc] initWithFrame:[window frame]]; 
    [window addSubview:view]; 
    [view release]; 
    [window makeKeyAndVisible]; 
} 
- (void)dealloc { 
    [window release]; 
    [super dealloc]; 
} 
@end 

Desde la sección discusiones sobre NHObject-dealloc método:

Tenga en cuenta que cuando una aplicación termina, objetos puede no se enviará un mensaje dealloc desde la memoria del proceso se borra automáticamente al salir-ES MÁS eficiente simplemente para permitir que el sistema operativo limpie 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

Pero dealloc método en el ejemplo anterior se le llama en la implementación actual si su aplicación es lo suficientemente rápido para reaccionar a applicationWillTerminate dentro de los 15 segundos.

De nuevo. ¿Debo evitar escribir el método dealloc anterior para la velocidad de salida de la aplicación o hay algún problema con dicho enfoque?

+1

¿Dónde insisten los manuales de Apple en ello? He leído la mayor parte de su documentación en un momento u otro y no recuerdo eso; de hecho, recuerdo haber leído lo contrario en varios lugares, que no desmantelar es mejor para la eficiencia. – Chuck

+0

Apple también afirma que no hay garantía de que reciba una llamada dealloc en algunas de estas clases cuando abandone. Por lo tanto, colocar código para guardar en su rutina dealloc sería algo malo. – mahboudz

+0

¿Por qué molestarse en escribir el código dealloc para ellos en tal caso? –

Respuesta

0

Porque es posible que una clase lanzada tenga un efecto secundario como el estado de almacenamiento en su método dealloc o una de sus súper clases. El sistema operativo no debería importar, debería reclamar todos los recursos sin importar qué.

+0

¿Estado de guardado en dealloc? ¿Por qué? –

+5

Guardar estado en dealloc es una muy mala idea, ya que no se garantiza la ejecución de dealloc. applicationWillTerminate se proporciona para guardar el estado. – mmc

+0

* Si * tiene una clase que lo hace, sí, debe liberarlo antes de la finalización. Pero los documentos de Apple dicen que debemos evitar eso tanto como sea posible, ya que los objetos generalmente no están destinados a ser liberados en la terminación. – Chuck

3

La mejor razón es la reutilización. Existe la posibilidad de que pueda mover un objeto de un lugar a otro o reutilizarlo. Si lo haces, es mejor asegurarte de que todas tus i's estén salpicadas y atravesadas.

También es solo un buen hábito. Si recuerda hacerlo allí, lo hará en todas partes.

+1

Sí, para mí es como usar un intermitente mientras conduzco a través de un estacionamiento. No es necesario, pero es bueno tener este hábito. –

+0

No está automatizado, es humano.Mecánicamente, repetir la misma acción una y otra vez sin pensarlo puede dañar tu cerebro. –

+1

¿Habilidad de reutilización? ¿Me estás preparando? ¿Cómo vas a reutilizar delegado de aplicación? Como un palo de dientes? –

0

El ejemplo de código que ha publicado no insiste en publicar nada cuando finaliza la aplicación. Si está pensando en el método dealloc, no se ejecutará cuando la aplicación finalice.

En varios lugares de la documentación, Apple señala que no enviar dealloc on dim es una opción de diseño intencional porque, como dijiste, es mucho más eficiente simplemente liberar todo el espacio de direcciones. Vea el discussion on the dealloc docs.

+0

Pero se está llamando. Lo he comprobado en el dispositivo real. Y este particular dealloc fuerza a todos esos objetos a dealloc también. Dicen: ... cuando una aplicación finaliza, es posible que los objetos no se envíen a un mensaje dealloc ... Significa que si después de 15 segundos su aplicación sigue guardando algo, terminará de todos modos omitiendo la desasignación. –

+0

Solo se invoca si libera el objeto en el que se encuentra el código. El tiempo de ejecución no lo está deshaciendo. – Chuck

4

Supongo que la única respuesta que tiene sentido para mí es la "coherencia". No, puede que no siempre necesite implementar dealloc, pero si siempre lo hace, no se olvidará de hacerlo cuando realmente importe. Y además, no es como si le costara más de 30 segundos escribir dos líneas de código que podrían no ser llamadas.

También es muy poco probable que desperdicie sus preciosos ciclos de CPU (que, por cierto, los ciclos no son tan valiosos como para notar la diferencia. Esas animaciones de iPhone existen principalmente para comprar el tiempo de su aplicación para iniciar/shut down) porque cuando termina la aplicación, generalmente no molesta a los objetos dealloc porque, como dices, los días de asignación de memoria del montón están detrás.

Por lo tanto, sí, dealloc es poco probable que se llame en un UIApplicationDelegate, pero ¿le cuesta algo hacer de todos modos? Realmente no.

+0

experiencia de salida de la aplicación IMHO es valioso. Por supuesto que debería medir eso, pero creo que la desasignación podría ser bastante costosa. –

+0

Bueno, como ya te has decidido, ¿por qué te molestaste en preguntar? – Alex

+0

He preguntado sobre los problemas en dicho enfoque. Es difícil de aceptar, ese equipo tan grande como el de Apple podría enseñar a hacer cosas innecesarias. Lo siento si te he irritado. –

6

Porque sabrá, Artem.

Juguemos a un pequeño juego llamado "¿y si?".

¿Qué pasa si, desarrolla una gran aplicación. Una aplicación magistral, de verdad, ¡y al público le encanta! ¡Sus ventas se hinchan, los pájaros cantan su nombre volando en el cielo!

Pero eligió no hacer nada en su AppDelegate dealloc. Con solo unos segundos, decidió no molestarse. ¿Cuál es el daño?

Oh, al principio duermes tranquilo encima de las pilas de dinero. Pero a medida que las ventas crecen y crecen, una pequeña punzada te invade. Y luego comienzan los sueños.

Formas cuadradas, imprecisas al principio. Los días pasan y se vuelven más claros, mientras duermes cada vez menos. Entonces, finalmente, un día, ya ves.

Son bloques, Artem. Bloques de memoria. ¿Y qué están haciendo en tus sueños? Bueno, ya ves, no del todo liberado de la existencia antes de que se acabe la aplicación, tenían que ir a algún lado. La aplicación se había ido, el teléfono se había movido.

Así que se movieron a su HEAD. Y cada día, llegan más, dejando menos espacio para YOURSELF.

Espero que esto haya sido informativo ... Artem.

+0

+ n votos (para valores de n cercanos a 1). – jbrennan

+0

Eso fue increíble. – Jasarien

+0

Posiblemente la mejor respuesta en SO nunca. –

Cuestiones relacionadas