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.
O forse http://stackoverflow.com/questions/8714875/why-does-xcode-4-2-use-autoreleasepool-in-main-m-instead-of-nsautoreleasepool –