Qual è il punto in una mantengono immediatamente seguito da un autorelease?
-
30-09-2019 - |
Domanda
sto guardando un po 'di codice open source e cercando di capire il motivo per cui l'autore ha qualcosa di fatto in un modo particolare.
La classe è un wrapper 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 cosa è con l'opzione Mantieni seguita da un autorelease immediato?
La mia reazione iniziale è stata che questo impedirebbe un segnale analizzatore di una perdita di memoria, ma mi ha analizzato senza trattenere / autorelease e c'era ancora alcun avviso.
Guardando il ciclo di vita, si creerebbe un oggetto, spinto alla pila e rilasciato, così lo stack possiede l'oggetto (la matrice sottostante manterrà su di aggiunta).
Quindi non capisco l'uso del mantenere / autorelease qui ...
Soluzione
Supponiamo top
sarebbe simile a questa:
- (id) top {
return [stack lastObject];
}
Poi immaginate questo:
foo = [bar top];
[bar removeAllObjects];
// Do something with foo
accadrebbe quanto segue: La seconda riga renderebbe la conservano contare goccia a 0, e dalla terza linea foo
indicherebbe memoria deallocato. Ma con il retain
e autorelease
il conservare conteggio è 1, fino a quando la piscina viene svuotata quindi sulla terza linea foo
sarebbe ancora scegliere un oggetto valido.