2010-09-07 9 views
8

Si consideri il seguente programma:Perché utilizzare NSAutoreleasePool?

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    // Insert code here... 
    NSLog(@"Programming is Fun !"); 
    [pool drain]; 
    return 0; 
} 

non capisco il motivo per cui è necessario pool lì come lo stesso programma può essere scritto anche come questo:

int main (int argc, const char * argv[]) { 
    NSLog(@"Programming is Fun !"); 
    return 0; 
} 

Che cosa è uno scopo di utilizzare un auto rilasciare pool? Perché e quando ne abbiamo bisogno? Sono obbligatori in ogni programma C obiettivo?

Se non si desidera rilasciare automaticamente alcun oggetto, è necessario utilizzare anche un pool di Rilascio automatico?

risposta

7

ma se io non voglio il rilascio automatico qualsiasi oggetto, poi fare anche ho bisogno di usare Auto Release piscina ??

Si noti inoltre che la biblioteca di cacao utilizza autorelease ampiamente. Così, anche se pensi di non utilizzare il pool nel tuo codice, devi preparare il pool

5

NSObject contiene una funzione ordinata chiamato autorelease. Questo significa che tutti gli oggetti in Objective-C contengono questa funzione.

Questa funzione inserisce self nel pool autorelease, ritardando la chiamata alla funzione release dell'oggetto fino a quando il pool di autorelease non viene deallocato. La maggior parte delle API interne utilizza un pool di autorelease e, accanto a quello che si trova in main(), ce n'è uno allocato e deallocato nel ciclo principale di UIKit in ogni passaggio.

In breve: è la coda per il decremento ritardato del contatore di riferimento.

Esempio di dove è nascosto autorelease:

[NSString stringWithUTF8String:"some string"]; 

Tale scopo viene allocato e autorelease è chiamato su di esso. Come lo useresti da solo?

MyObject *obj = [[[MyClass alloc] init] autorelease]; 

Perché è buono? Quando si restituisce questo oggetto, la funzione chiamante non ha bisogno di fare attenzione a rilasciare questo oggetto, e facoltativamente può conservarlo (ma non deve).


Per espandere e chiarire quattro anni più tardi:

Mentre UIKit e AppKit creare e drenare un NSAutoreleasePool durante il corso della loro runloop principale, nel programma non-GUI è necessario creare da soli. Il codice vario si aspetta che sia presente un NSAutoreleasePool e dal momento che non hai inizializzato un framework GUI e non ne usi uno, non esiste un codice che lo creerà magicamente per te.

Mentre NSLog() e una costante NSString nel tuo esempio non richiedono una piscina, anche il banale [NSMutableArray array] fa, dato che in realtà può essere interpretato come [[[NSMutableArray alloc] init] autorelease].

0

Ho trovato il motivo ... "Se un pool non è disponibile, gli oggetti autoreleased non vengono rilasciati e si perde memoria In questa situazione, il programma in genere registra i messaggi di avviso appropriati."

+0

Se trovi qualche altra risposta particolarmente utile, sentiti libera di "alzarla" e/o contrassegnarla come corretta. –

0

Generalmente non è necessario creare un blocco pool di autorelease, né visualizzare il codice utilizzato per crearne uno . tre occasioni in cui è possibile utilizzare i propri blocchi di pool di autorelease,

  • Se si sta scrivendo un programma che non è basato su un framework UI, come uno strumento da riga di comando.

  • Se si scrive un ciclo che crea molti oggetti temporanei - È possibile utilizzare un blocco piscina autorelease all'interno del ciclo di disporre di quegli oggetti prima della prossima iterazione. L'utilizzo di un blocco pool autorespirativo nel ciclo consente di ridurre il massimo ingombro di memoria dell'applicazione.

  • Se si genera un thread secondario: è necessario creare il proprio blocco pool di autorilease non appena il thread inizia l'esecuzione; altrimenti, l'applicazione perde oggetti.

Problemi correlati