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]
.
fonte
2010-09-07 13:51:39
Se trovi qualche altra risposta particolarmente utile, sentiti libera di "alzarla" e/o contrassegnarla come corretta. –