Domanda

ho capito è necessario essere attenti con autorelease su iOS. Ho un metodo che restituisce un oggetto che alloc s che è necessario dal chiamante, quindi in questa situazione - se ho capito bene - Ho bisogno di inviare retain all'oggetto nel chiamato prima che ritorni.

Questo va bene, ma una volta che il controllo ritorna al telefono (vale a dire dopo il mio pulsante di scatto è stato elaborato) sembra che il pool autorelease viene rilasciato. Ho il sospetto che questo è come dovrebbe essere, ma mi chiedo che cosa è la pratica migliore per questa situazione.

Ho fatto ricorso a invio di un messaggio dealloc dal chiamante in modo che l'oggetto non viene rilasciato e quindi esplicitamente rilasciarlo in <=>.

E 'questo l'approccio migliore?

È stato utile?

Soluzione

La piscina autorelease viene tipicamente rilasciato dopo ogni iterazione del ciclo di esecuzione. Approssimativamente, ogni applicazione Cocoa e Cocoa Touch è strutturato in questo modo:

Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool

Ciò che si descrive è il comportamento previsto. Se si desidera mantenere un oggetto intorno a qualsiasi più lungo di quello, è necessario mantenere in modo esplicito.

Altri suggerimenti

Utilizzando autorelease è un modo di dire, "Oggetto, io non voglio più di te, ma ho intenzione di passare a qualcun altro che potrebbe desiderare, in modo da non svaniscono appena ancora." Quindi l'oggetto si attacca intorno abbastanza a lungo per voi di tornare da un metodo o di darlo ad un altro oggetto. Quando un certo codice vuole mantenere l'oggetto attorno, deve rivendicare la proprietà da retain ing esso.

le linee guida di gestione della memoria per tutto il necessario per sapere per utilizzare <=> correttamente.

Ecco un examle previsto il documento di Apple gestione della memoria :

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
        /* Do a search that creates a lot of temporary objects. */ 
        match = [self expensiveSearchForObject:anObject]; 
        if (match != nil) { 
            [match retain]; /* Keep match around. */ 
        } 
        [subPool release]; 
    } 
    return [match autorelease];   /* Let match go and return it. */ 
}

Sì, questo è l'approccio migliore. Autorelease è davvero destinato esclusivamente per le interazioni nel codice che si sa. Una volta entrato memorizzare un oggetto, si dovrebbe sapere che sia l'oggetto che contiene un riferimento non morirà / andare fuori del campo di applicazione fino a quando il gioco è fatto anche con l'oggetto, o hai bisogno di mantenere l'oggetto.

E 'garantita solo che gli oggetti autoreleased saranno rilasciati dopo la fine del metodo. Dopo tutto, il metodo che ha chiamato il metodo avrebbe potuto creare la propria piscina e rilasciarlo subito dopo il metodo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top