2010-02-11 10 views
9

Me he dado cuenta, mientras aprendía cómo funciona CocoaTouch en las últimas semanas, que los métodos dealloc no parecen recibirse cuando salgo de la aplicación en el simulador de iPhone. Ahora, para ser justos, no estoy haciendo nada demasiado científico, simplemente poniendo en NSLog declaraciones que pueden imprimir en la consola. Mis preguntas son:¿Se llama a dealloc en iPhone?

  1. ¿El simulador de desconexión de Xcode en la salida aplicación detener mis NSLog s haciendo eco a la consola?

  2. ¿No se llama dealloc como una optimización, porque la aplicación está saliendo de todos modos?

  3. ¿Se llamará al dealloc cuando la aplicación se está ejecutando en un hardware de iPhone real?

+1

También he encontrado en Mac OS X que no se llama a 'dealloc' cuando la aplicación finaliza. Cualquier memoria que esté en uso será reclamada por el sistema operativo de todos modos. – dreamlax

Respuesta

10

El docs dice que es más eficiente que el sistema operativo reclame la memoria de una vez que la aplicación abandone lentamente todos sus fragmentos de memoria. Por este motivo, dealloc no se puede enviar a una gran cantidad de objetos; y para este razón por la cual es importante no administrar los recursos escasos en dealloc. Para limpiar los recursos escasos, probablemente sea una mejor idea que el delegado de su aplicación responda al applicationWillTerminate: y realice la limpieza allí.

- (void) applicationWillTerminate:(NSApplication/UIApplication *) anApp 
{ 
    [scarceResourceManager relinquishScarceResources]; 
} 
+3

Para ser directo: gastar ciclos de la CPU al llamar 'free()' o '-deallocate' cuando una aplicación finaliza es una pérdida total y total de recursos. Tanto Mac OS X como iPhone usan un modelo de memoria donde cada proceso se mantiene aislado. Cuando finaliza un proceso, * todos * los recursos de memoria relacionados con esa aplicación se reclaman todos a la vez. – bbum

+0

Gracias dreamlax y bbum, es algo que me ha estado molestando por un tiempo, muy apreciado. – fuzzygoat

+0

Tanto dreamlax como bbum tienen razón. La liberación de la memoria al finalizar es un desperdicio, pero lo importante es que hay muchas cosas que hacer al finalizar, excepto liberar la memoria. Y esta publicación es valiosa para esos casos. – Eonil

0

Como ya se ha dicho dreamlax, el sistema recupera toda la memoria tan pronto como se cierra la aplicación. Por lo tanto, no sirve de nada que la aplicación llame a dealloc al salir. Es un comportamiento estándar en Mac OS X, y dudo que sea diferente en un iPhone, simulado o "real".

Cuestiones relacionadas