2012-08-07 3 views
5

Eventuali duplicati:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0Inizializzazione NSMutableArray con e senza capacità di

Qual è la differenza tra la seguente riga di codice? qual è l'esatto vantaggio e svantaggio? supponiamo che dopo farò 3 operazione addObject.

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity: 5]; 
NSMutableArray *array = [[NSMutableArray alloc] init]; 
+0

Non è un duplicato esatto di nessuna di queste domande, anche se è abbastanza vicino a quella superiore. – JeremyP

+0

possibile duplicato di [Objective-c NSArray init versus initWithCapacity: 0] (http://stackoverflow.com/questions/6077422/objective-c-nsarray-init-versus-initwithcapacity0), [NSMutableArray initWithCapacity: nuances] (http: //stackoverflow.com/questions/3948062/), –

risposta

5

regolarmente la differenza con linguaggi orientati agli oggetti e array di varie dimensioni è: il sovraccarico si otterrà e le colpe di pagina a livello di memoria.

Per metterlo in un altro modo, immagina di avere un oggetto che richiede 5 spazi in memoria (proprio come il tuo primo esempio) e il secondo oggetto non riserva alcuno spazio. Pertanto, quando un oggetto deve essere aggiunto al primo, ci sarà già spazio nella memoria per farlo semplicemente cadere, d'altra parte l'oggetto non assegnato dovrà prima richiedere spazio sulla memoria e poi aggiungerlo al array. Questo non suona così male a questo livello, ma quando i tuoi array aumentano di dimensioni questo diventa più importante.

Da Apple's documentation:

arrayWithCapacity:

crea e restituisce un oggetto NSMutableArray con memoria allocata sufficiente per contenere inizialmente un certo numero di oggetti. ... La capacità iniziale del nuovo array. Valore di restituzione Un nuovo oggetto NSMutableArray con memoria allocata sufficiente a contenere oggetti numItems.

+0

Una buona ipotesi, ma non è proprio quello che sta succedendo ... vedi la risposta di Jeremy. – bbum

+0

@bbum Penso che non sia l'ipotesi. È una spiegazione adeguata. Mentre nella risposta di Jeremy, ha usato potrebbe essere. – Saad

+1

@Saad No, davvero, è una supposizione. Leggi la fonte (CFFoundation è open source). Se si richiede un array con 100.000 slot, non sarà necessariamente necessario allocare tutte queste slot in anticipo. La struttura dei dati è un po 'più complessa di una matrice piatta e, quindi, la documentazione è fuorviante, ma non del tutto errata. – bbum

8

Funzionalmente entrambe le istruzioni sono identiche.

Nel primo caso, si sta dando al tempo di esecuzione un suggerimento che presto si aggiungeranno cinque oggetti all'array in modo che possa, se lo desidera, preallocare uno spazio per loro. Ciò significa che le prime cinque invocazioni addObject: potrebbero essere leggermente più veloci utilizzando la prima istruzione.

Tuttavia, non vi è alcuna garanzia che il tempo di esecuzione non faccia altro che ignorare il suggerimento. Non uso mai lo initWithCapacity: da solo. Se mai dovessi arrivare a una situazione in cui addObject: è un collo di bottiglia significativo delle prestazioni, potrei provare per vedere se le cose migliorano.

+1

Giusto - o, per dirla senza mezzi termini: non preoccuparti della versione suggerita. – bbum