2012-08-07 22 views
5

Duplicar posibles:
NSMutableArray initWithCapacity nuances
Objective-c NSArray init versus initWithCapacity:0Inicializando NSMutableArray con y sin capacidad de

¿Cuál es la diferencia entre la línea de código? ¿Cuál es la ventaja y desventaja exactas? supongamos que a continuación haré 3 operaciones addObject.

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

No es un duplicado exacto de ninguna de esas preguntas, aunque es bastante parecido al primero. – JeremyP

+0

posible duplicado de [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/), –

Respuesta

5

Regularmente la diferencia con los idiomas y las matrices de diferentes tamaños orientados a objetos es: la sobrecarga obtendrá y los fallos de página en el nivel de memoria.

Para poner esto de otra manera imagine que tiene un objeto que solicita 5 espacios en la memoria (al igual que su primer ejemplo) y el segundo objeto no reserva ningún espacio. Por lo tanto, cuando un objeto necesita ser agregado al primero, ya habrá espacio en la memoria para que caiga, por otro lado el objeto no asignado primero tendrá que solicitar espacio en la memoria y luego agregarlo al formación. Esto no suena tan mal en este nivel, pero cuando las matrices aumentan de tamaño, esto se vuelve más importante.

De Apple's documentation:

arrayWithCapacity:

crea y devuelve un objeto NSMutableArray con memoria asignada suficiente para mantener inicialmente un número dado de objetos. ... La capacidad inicial de la nueva matriz. Valor devuelto Un nuevo objeto NSMutableArray con memoria asignada suficiente para contener objetos numItems.

+0

Una buena suposición, pero eso no es realmente lo que está sucediendo ... ver la respuesta de Jeremy. – bbum

+0

@bbum Creo que no es la suposición. Es una explicación adecuada. Mientras que en la respuesta de Jeremy, él ha utilizado puede ser. – Saad

+1

@Saad No, en realidad, es una suposición. Lea la fuente (CFFoundation es de código abierto). Si solicita una matriz con 100.000 ranuras, no necesariamente asignará todas las ranuras antes de tiempo. La estructura de datos es un poco más compleja que una matriz plana y, por lo tanto, la documentación es engañosa, pero no del todo incorrecta. – bbum

8

Funcionalmente, ambas sentencias son idénticas.

En el primer caso, le está dando al tiempo de ejecución una pista de que pronto agregará cinco objetos a la matriz para que, si lo desea, pueda preasignar espacio para ellos. Eso significa que las primeras cinco invocaciones addObject: pueden ser marginalmente más rápidas usando la primera instrucción.

Sin embargo, no hay garantía de que el tiempo de ejecución haga nada más que ignorar la pista. Nunca utilizo initWithCapacity:. Si alguna vez llego a una situación en la que addObject: es un cuello de botella de rendimiento significativo, podría intentarlo para ver si las cosas mejoran.

+1

Derecha - o, para decirlo sin rodeos: No te molestes con la versión sugerida. – bbum

Cuestiones relacionadas