2010-11-02 6 views
5

Quando ho bisogno di un array per uso temporaneo, qual è la differenza tra questi:Autorelease vs rilasciare

1:

NSMutableArray *stuff = [[NSMutableArray alloc] init]; 
// use the array 
[stuff release]; 

2:

NSMutableArray *stuff = [NSMutableArray array]; 
// use the array 

3:

NSMutableArray *stuff = [[[NSMutableArray alloc] init] autorelease]; 
// use the array 

Preferisco il numero 2, poiché è più corto. Ci sono dei buoni motivi per usare il numero 1 o 3?

risposta

10

Il numero 2 è probabilmente la scelta migliore nella maggior parte dei casi.

Il numero 1 ha la possibilità di perdere il rilascio a un certo punto lungo la linea, per qualsiasi motivo, ma rilascia l'array immediatamente, che in ambienti con problemi di memoria può essere utile.

Il numero 3 è fondamentalmente un equivalente verboso del numero 2, ma risulta utile se si desidera utilizzare un initWith * che non ha un array corrispondenteWith *.

Nota: Se sei memoria morto di fame, come ad esempio in un ciclo costoso in cui è necessario un allineamento fresco per ogni iterazione; non rilasciare e allocare nuovi array; basta usare -removeAllObjects e riciclare l'array.

+0

Grazie! Un buon punto sull'immediato rilascio della memoria nel numero 1. – keronsen

+2

Su iPhone, la maggior parte delle persone usa il numero 1 perché la memoria viene restituita al runtime prima. In effetti, Apple consiglia di evitare la possibilità di autorelease il più possibile (su iPhone). – JeremyP

+1

Buona risposta, salvo per l'ultimo bit. Scommetto che la differenza tra la creazione di un nuovo array su ogni passaggio e la rimozione di tutti gli oggetti è incommensurabile e, molto probabilmente, la rimozione di tutti gli oggetti sarà banalmente lenta. In ogni caso, non ottimizzare fino a quando non si ha un problema di prestazioni quantificato. – bbum