2009-05-08 30 views
15

Tengo un lazo for. Dentro de ese ciclo quiero llenar un NSArray con algunos objetos. Pero no veo ningún método que me permita hacer eso. Sé de antemano cuántos objetos hay. Quiero evitar un NSMutableArray, ya que algunas personas me dijeron que es una gran sobrecarga y freno de rendimiento en comparación con NSArray.¿Cómo puedo llenar un NSArray dinámicamente?

Tengo algo como esto:

NSArray *returnArray = [[NSArray alloc] init]; 
for (imageName in imageArray) { 
    UIImage *image = [UIImage imageNamed:imageName]; 
    //Now, here I'd like to add that image to the array... 
} 

miré en la documentación para NSArray, pero ¿Cómo se especifica cuántos elementos van a estar ahí? ¿O debo usar realmente NSMutableArray para eso?

+0

No tengo tiempo para buscar esto en este momento, pero quizás primero deba crear un NSMutableArray y luego usar un método para obtener la versión Inmutable. No estoy seguro si eso simplemente le daría una interfaz Inmutable y no ganaría velocidad (es decir, podría ser la misma implementación subyacente como mutable), pero vale la pena verla. Por lo que recuerdo, los documentos de Apple son claros como el barro en esto. – frankodwyer

+5

¡No escuche a las personas que le dicen que algo tiene un mal rendimiento! NSMutableArray es una parte central de Objective-C, está altamente optimizado y no hay razón para evitarlo. –

Respuesta

28

Sí, es necesario utilizar un NSMutableArray:

int count = [imageArray count]; 
NSMutableArray *returnArray = [[NSMutableArray alloc] initWithCapacity:count]; 
for (imageName in imageArray) { 
    UIImage *image = [UIImage imageNamed:imageName]; 
    [returnArray addObject: image]; 
    ... 
} 

EDITAR - Declaración fijo

+0

Gracias. ¿Estás seguro de que la estructura de datos de la variable es de tipo NSArray y no NSMutableArray? ¿O son esos intercambiables? – Thanks

+0

NSMutableArray es una subclase de NSArray, por lo que es seguro. – Alnitak

+0

Sí, lo olvidé. ¡Gracias! Eso plantea otra pregunta;) – Thanks

3

¿Sería este un buen momento para usar un NSMutableArray?

Sé que ha mencionado que le gustaría evitarlo, pero a veces hay una razón para cosas como esta.

4

Necesitará usar un NSMutableArray para eso porque agregar es una mutación y NSArray es inmutable.

usted podría hacer un NSMutableArray poblada en un NSArray después (see here for a discussion) pero no va a añadir elementos a una edad normal NSArray en cualquier momento pronto.

2

Yo aconsejaría a la optimización sólo cuando sepa NSMutableArrayes que causan un impacto en el rendimiento, pero si lo es, siempre puede crear una aray estática a partir de una matriz mutable después de haberla poblado. Depende de si el golpe de rendimiento es causado por el uso posterior del NSMutableArray o simplemente al crearlo.

Supongo que este no será el cuello de botella de rendimiento en su aplicación.

+0

http://stackoverflow.com/questions/1746204/ para una discusión sobre el rendimiento. – nschum

Cuestiones relacionadas