2011-04-23 6 views
6

Según entiendo, objetos autoreleased se limpian una vez una piscina autoreleased se libera. Ahora, el grupo de liberación automática se lanzará al final del ciclo de ejecución.Fin del bucle de ejecución - la recuperación de la piscina autorelease

Mi pregunta es, si en mi clase no estoy creando un grupo de autorrelease personalizado y llamando al método de liberación automática en algunos objetos de esa clase, ¿en qué punto se recuperarán esos objetos? ¿El "final del ciclo de ejecución" implica el "final de la aplicación"?

Respuesta

20

usted tiene que entender el concepto de una carrera de circuito. El ciclo de ejecución en iOS espera a que suceda algún evento y luego actúa sobre él. Ese evento podría ser que el usuario toque la pantalla, se recibe una llamada, etc.

Para cada uno de esos eventos que el IOS se encarga, una piscina autorelease nueva se crea al principio y al drenado cuando el procesamiento de eventos se ha completado. En teoría, podría haber cualquier cantidad de pools de autorelease anidados creados por Cocoa Touch, pero el principal que debe conocer es el bucle de eventos.

Quizás este diagrama del Application Life Cycle ayude.

UIKit event loop.

En pseudo-código, esto se reduce a,

int UIApplicationMain(...) { 
    while (!shouldQuitApplication) { 
     Event *someEvent = // wait for next event; 
     NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init]; 
     // handle event 
     [myPool release]; 
    } 
} 

Estos son los tipos de eventos en iOS

UIEventTypeTouches, 
UIEventTypeMotion, 
UIEventTypeRemoteControl, 

Así que después de cada toque, movimiento, o evento de control remoto se procesa, la la piscina será drenada

0

No realmente. Imagine que RunLoop tiene "círculos" :) Al comienzo de cada "círculo", RunLoop crea un grupo Autorelease y lo drena antes de salir del "círculo".

+0

A menos que y hasta que no estoy creando una piscina AutoRelease específico para mi código, no es que lo hará sólo una piscina en la pila a nivel de aplicación? Si estoy creando mis propios grupos de autorrelease personalizados, entonces esto es comprensible. ¿RunLoop también creó múltiples pools de liberación automática por sí mismo? – Abhinav

+0

Bueno. Si desea saber más acerca de runloops, se puede leer aquí: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1 Acerca de su pregunta ... No hay forma de saber cuántos grupos de autorreleases estarán allí en la pila. Si ejecuta su código desde runloop, no desde un hilo personalizado, hay al menos uno. Debes crear tus propios grupos cuando ejecutas el código a partir de un hilo personalizado. – bealex

3

El "final" del ciclo de ejecución significa el final de cada iteración del ciclo de ejecución, no el final de la aplicación.

Cuestiones relacionadas