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 ...

È stato utile?

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.

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