Sì e no. Finiresti per rilasciare la memoria di stringa ma "trapelare" l'oggetto NSAutoreleasePool in memoria utilizzando drain invece di release se lo hai eseguito in un ambiente Garbage Collection (non gestito dalla memoria). Questa "perdita" rende semplicemente l'istanza di NSAutoreleasePool "irraggiungibile" come qualsiasi altro oggetto senza puntatori forti sotto GC, e l'oggetto verrebbe ripulito la prossima volta che GC viene eseguito, il che potrebbe benissimo essere direttamente dopo la chiamata a -drain
:
scolare
In un ambiente Garbage Collection, attiva la Garbage Collection se la memoria allocata dall'ultima raccolta è maggiore della soglia corrente; altrimenti si comporta come release. ... In un ambiente raccolto dalla spazzatura, questo metodo alla fine chiama objc_collect_if_needed
.
Altrimenti, è simile a come -release
si comporta in condizioni non GC, sì. Come altri hanno affermato, -release
è un no-op in GC, quindi l'unico modo per assicurarsi che il pool funzioni correttamente in GC è attraverso -drain
, e -drain
in non-GC funziona esattamente come -release
in non-GC e probabilmente comunica la sua funzionalità più chiaramente come bene.
Vorrei sottolineare che la tua dichiarazione "qualsiasi cosa chiamata con new, alloc o init" non dovrebbe includere "init" (ma dovrebbe includere "copy"), perché "init" non alloca memoria, imposta solo l'oggetto (costruttore moda). Se hai ricevuto un oggetto allocato e la tua funzione si chiama solo init come tale, non lo rilasceresti:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Ciò non consuma più memoria di quella con cui hai già iniziato (supponendo che init non installi gli oggetti, ma non sei comunque responsabile di quelli).