2013-02-03 8 views
45

Eventuali duplicati: pagina iniziale
Why use Autorelease pool?Che cos'è autoreleasepool?

Tutti Objective-C si apre con una dichiarazione di default @autoreleasepool{...} sotto la dichiarazione di funzione principale. Ma cosa sta effettivamente facendo questa affermazione? Il nuovo Objective-C rilascia automaticamente oggetti e l'eliminazione della linea non modifica nulla al programma. Questo comando è davvero necessario?

+0

O forse http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –

risposta

71

L'istruzione @autoreleasepool esegue lo stesso lavoro di prima, invece di utilizzare la classe NSAutoreleasePool. Il modo in cui NSAutoreleasePool ha funzionato è stato un po 'strano, poiché la sua creazione ha prodotto un effetto su tutta l'intera applicazione; @autoreleasepool crea un'area con ambito e rende più chiaro ciò che è all'interno del pool e quando si esaurisce (quando non è più in uso). È anche più efficiente secondo Apple.

Il concetto di pool di autorelease è semplice, ogni volta che un'istanza dell'oggetto viene contrassegnata come autorizzata (ad esempio NSString* str = [[[NSString alloc] initWithString:@"hello"] autorelease];), avrà un conteggio di mantenimento di +1 in quel momento, ma alla fine del ciclo di esecuzione , il pool viene svuotato e qualsiasi oggetto contrassegnato come autorelease ha il conteggio dei ritiri decrementato. È un modo per tenere in ordine un oggetto mentre prepari ciò che lo manterrà per se stesso.

Con ARC, mentre la parola chiave autorelease non è utilizzata dallo sviluppatore, il sistema sottostante che gestisce ARC inserisce quello per te. (Ricorda: Tutto ciò che sta facendo ARC sta inserendo le chiamate retain, release e autorelease per te negli orari appropriati). Per questo motivo, il concetto di AutoreleasePool esistente deve rimanere in circolazione.

Se si rimuove il pool autorelease, gli oggetti inizieranno fuoriuscita

In un ambiente di riferimento contati, cacao si aspetta che ci sia una piscina autorelease sempre disponibile. Se un pool non è disponibile, gli oggetti autoreleased non vengono rilasciati e si perde memoria. In questa situazione, il tuo programma registrerà di solito messaggi di avvertimento adeguati.

+0

Questo significa che, se Io uso ARC e rilascio un oggetto da qualche parte al di fuori del '' @autoreleasepool {} '' l'oggetto esiste ancora fino alla fine del blocco @autoreleasepool? – confile

+2

Se si rilascia manualmente un oggetto autoreleased, quando si raggiunge la fine del pool di autorelease, l'oggetto dealloc'd non esisterà più e si verificherà un'eccezione probabilmente da qualche parte in framework o codice macchina. Se si tratta di un lungo percorso di codice, la tua app potrebbe sembrare bloccarsi in un punto apparentemente non correlato a causare confusione. – jcpennypincher

Problemi correlati