Entrambi mantengono e autorelease, funzionalmente conservano un oggetto ma non fondono. Le differenze sono che i conteggi di mantenimento possono essere decrementati solo da un altro oggetto mentre i conteggi autoreleased vengono decrementati automaticamente quando NSAutoreleasePool viene scaricato. Se nessun altro oggetto ha trattenuto l'oggetto autorelasciato al momento del drenaggio della piscina, si spegne.
Fondamentalmente, si utilizza la funzione di autorelease quando si desidera assicurarsi che un oggetto si blocchi nel metodo corrente e possa essere passato ad altri oggetti ma non si desidera che si debba tenere traccia della sua versione.
Nel codice di esempio, l'autorelease è solo una misura di sicurezza. L'oggetto NSPredicate viene rilasciato perché il suo lavoro è finito ma il programmatore voleva assicurarsi che l'oggetto NSFetchRequest rimanesse in sospeso. Non è necessario utilizzare "autorelease" in questo caso, ma se hai perso il conto delle tue versioni, il file fetchRequest potrebbe scomparire.D'altra parte, non lo si vuole orfano e perde, quindi si utilizza la correzione automatica per pulire quando il pool è in fogna.
L'uso più comune di autorelease è quando si crea un numero variabile di oggetti ogni volta. Non vuoi doverli rintracciare tutti così li autorizzi automaticamente e lasciare che la piscina si prenda cura di loro. (Ancora meglio, si crea un pool locale e lo si esaurisce non appena fatto).
Nello standard API Apple, qualsiasi metodo che crea un nuovo oggetto senza le parole chiave 'init', 'new' o 'create 'restituisce un oggetto autoreleased.
-[NSString initWithString:]
non è autorelease ma - [NSString stringWithString:] è. Ciò causa problemi negli ambienti di raccolta non Garbage perché stringWithString:
restituisce una stringa che sembra comportarsi come un oggetto mantenuto, ma in seguito scomparirà improvvisamente apparentemente a caso quando il pool di autorilease è stato creato negli scarichi.
Edit01: Dal
una piscina autorelease di Apple Docs è un esempio di NSAutoreleasePool che “contiene” altri oggetti che hanno ricevuto un messaggio di autorelease; quando il pool di autorelease viene deallocato, lo invia un messaggio di rilascio a ciascuno degli oggetti . Un oggetto può essere messo in un pool di autorelease più volte e riceve un messaggio di rilascio per ogni volta che è stato inserito nel pool . Pertanto, l'invio autorelease invece di disperdere un oggetto prolunga la durata di tale oggetto in almeno fino alla piscina stessa è rilasciato (l'oggetto può sopravvivere maggiore se viene trattenuto nel intermedio).
Il mantenimento conta e autorelease entrambi mantengono un oggetto vivo dallo stesso meccanismo di conteggio base (ma separato). La principale differenza è che l'oggetto proprietario invia la versione. Con i conteggi mantenuti, è un altro oggetto ma per un conteggio autorecondato è il pool di autorelease.
Questa è la spiegazione più succinta che ho letto per autorelease. – TechZen
Ottima risposta davvero! +! La modifica automatica –