2011-05-20 11 views
18

HazObjetivo-c NSArray init frente initWithCapacity: 0

[[NSMutableArray alloc] init]; 

y

[[NSMutableArray alloc] initWithCapacity:0]; 

compilar en exactamente la misma cosa?

Si difieren, ¿cómo y qué forma es "mejor" en términos de rendimiento de memoria y tiempo de ejecución?

+0

Sin conocer los detalles de la implementación me gustaría poder creer y decir que el equipo de la Fundación hizo la diferencia de rendimiento entre los dos insignificantes. Desde una opinión personal, creo que es una buena práctica llamar a cualquier inicializador provisto por la clase sobre uno genérico si tiene sentido. Como NSMutableArray declara públicamente initWithCapacity y simplemente hereda init, me inclino por usar initWithCapacity. Además, ¿por qué no escribir un ciclo que analiza muchas creaciones de matriz mutables usando init e initWithCapacity y agrega tus observaciones? – Joe

+3

Véase también [NSMutableArray initWithCapacity matices] (http://stackoverflow.com/questions/3948062/nsmutablearray-initwithcapacity-nuances). – albertamg

+0

Tenga cuidado con la optimización prematura. – NSResponder

Respuesta

18

No, no se comportarán de forma idéntica. init creará una matriz con alguna capacidad desconocida pero probablemente distinta de cero, independientemente de lo que los autores decidieron que era un valor razonable predeterminado para la mayoría de las situaciones. initWithCapacity:0 solicitará una matriz sin ningún espacio asignado. Lo que esto significa es hasta la implementación NSMutableArray: puede no permitir una capacidad de 0 y comportarse exactamente como init, o puede no asignar nada inmediatamente y en su lugar asignar una cantidad (lo mismo que init, posiblemente, o tal vez no) cuando primero lo necesito

Lo que funcionará "mejor" depende completamente de cómo espere utilizar la matriz. -init dice: "No tengo expectativas para este conjunto; lo agregaré mucho y eliminaré mucho de él, o será bastante pequeño". -initWithCapacity: dice "Espero que esta matriz no tenga más que estos muchos elementos en el futuro previsible".

Sobre el único lugar donde esperaría que initWithCapacity:0 fuera razonable es si está creando una matriz que no espera llenar con nada durante un período de tiempo bastante largo.

Tenga en cuenta que la advertencia de rendimiento estándar se aplica aquí: probablemente no sea un problema a menos que haga un perfil y determine que sí lo es. Realmente no puedo imaginar una situación (excepto por miles y miles de objetos NSMutableArray) donde la diferencia entre estos dos será sustancial.

+5

+1 tenga en cuenta que usar 'initWithCapacity: n' no le impide agregar más de * n * objetos a la matriz. Es solo una sugerencia, por lo que 'NSArray' puede intentar hacer algo de optimización debajo del capó. –

+1

Consulte también [esta publicación del blog] (http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html) por Matt Gallagher – Scott

Cuestiones relacionadas