7

Sto guardando un codice open source e sto cercando di capire perché l'autore ha fatto qualcosa in un modo particolare.Qual è il punto in un fermo immediatamente seguito da un autorelease?

La classe è un involucro intorno NSArray per creare una struttura di dati stack con spinta, pop, ecc

Un metodo è topObject che restituisce l'oggetto superiore nella pila e la sua attuazione è:

- (id)top { 
    return [[[stack lastObject] retain] autorelease]; // stack is an instance of NSMutableArray 
} 

Che cos'è il retain seguito da un'autelease immediato?

La mia prima reazione è stata che questo avrebbe impedito un avvertimento dell'analizzatore su una perdita di memoria, ma ho analizzato senza il mantenimento/autorelease e non c'era ancora alcun avviso.

Guardando al ciclo di vita, un oggetto verrebbe creato, inserito nello stack e rilasciato, quindi lo stack possiede l'oggetto (l'array sottostante lo manterrà all'aggiunta).

Quindi non capisco l'uso del mantenere/autorelease qui ...

risposta

9

Supponiamo top sarebbe simile a questa:

- (id) top { 
    return [stack lastObject]; 
} 

Poi immaginate questo:

foo = [bar top]; 
[bar removeAllObjects]; 
// Do something with foo 

Accadrà quanto segue: La seconda riga farebbe cadere il conteggio dei fermi a 0, e con la terza riga foo farebbe riferimento alla memoria deallocata. Ma con retain e autorelease il conteggio di ritenzione è 1, finché il pool non viene svuotato così sulla terza riga foo farebbe ancora riferimento a un oggetto valido.

+0

Ha senso, grazie. – Jasarien

+4

Non è ancora corretto farlo imho. La guida alla programmazione della gestione della memoria afferma "Proprio come non dovresti preoccuparti del conteggio di conservazione effettivo di un oggetto, non dovresti preoccuparti del fatto che un oggetto restituito sia autorizzato o meno. L'unica preoccupazione è che ne possiedi o non." - quindi la conservazione + autorelease dovrebbe avvenire nel foo = [bar top]; linea, non nel metodo - (id) top {}. –

+0

Risposta ben spiegata. –

Problemi correlati