2011-04-23 13 views
6

Come ho capito, gli oggetti autoreleased vengono puliti una volta rilasciato un pool autoreleased. Ora, il pool di autorelease verrà rilasciato alla fine del ciclo di esecuzione.Ciclo di fine ciclo - recupero pool autorilease

La mia domanda è, se nella mia classe non sto creando un pool di autorelease personalizzato e chiamando il metodo di autorelease su alcuni oggetti in quella classe, a che punto verranno recuperati quegli oggetti? La "fine del ciclo di esecuzione" implica la "fine dell'applicazione"?

risposta

20

È necessario comprendere il concetto di un ciclo di esecuzione. Il ciclo di esecuzione in iOS attende alcuni eventi e quindi agisce su di esso. Questo evento potrebbe essere l'utente che tocca lo schermo, ricevere una chiamata, ecc.

Per ogni evento di questo genere gestito da iOS, un nuovo pool è creato all'inizio e scaricato quando l'elaborazione dell'evento è completa. In teoria, ci potrebbe essere un numero qualsiasi di pool di autorelease nidificati creati da Cocoa Touch, ma quello principale che dovresti conoscere è il ciclo degli eventi.

Forse questo schema da Application Life Cycle sarà di aiuto.

UIKit event loop.

In pseudo-codice, questo si riduce a,

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

Questi sono i tipi di eventi in iOS

UIEventTypeTouches, 
UIEventTypeMotion, 
UIEventTypeRemoteControl, 

Così, dopo ogni tocco, movimento o evento telecomando viene elaborato, la la piscina sarà prosciugata.

0

Non proprio. Immagina che RunLoop abbia "cerchi" :) All'inizio di ogni "cerchia", RunLoop crea il pool Autorelease e lo drena prima di uscire dal "cerchio".

+0

A meno che e fino a quando non sto creando un pool AutoRelease specifico per il mio codice, non è che ci sarà un solo pool nello stack a livello di applicazione? Se non riesco a creare i miei pool di autorelease personalizzati, allora è comprensibile. RunLoop ha anche creato più pool di autorelease autonomamente? – Abhinav

+0

Bene. Se vuoi saperne di più su runloop, puoi leggere qui: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html#//apple_ref/doc/uid/10000057i-CH16-SW1 Informazioni sulla domanda ... Non è possibile sapere quanti pool di autorelease saranno presenti nello stack. Se si esegue il codice da runloop, non da un thread personalizzato, ce n'è almeno uno. È necessario creare i propri pool quando si esegue il codice da un thread personalizzato. – bealex

3

La "fine" del ciclo di esecuzione indica la fine di ogni iterazione del ciclo di esecuzione, non la fine dell'applicazione.