2009-11-17 9 views
31

Estoy usando una matriz para almacenar objetos almacenados en caché cargados desde una base de datos en mi aplicación de iPhone, y me preguntaba: ¿hay alguna desventaja significativa al usar NSMutableArray que deba conocer?desventaja de usar NSMutableArray vs NSArray?

editar: Sé que NSMutableArray se puede modificar, pero estoy buscando razones específicas (rendimiento, etc.) por qué uno usaría NSArray. Supongo que habría una diferencia en el rendimiento, pero no tengo idea si es significativo o no.

Respuesta

47

Si va a cargar los objetos de una base de datos y usted sabe exactamente la cantidad de objetos que tiene, lo más probable sería obtener el mejor rendimiento de NSMutableArray s método arrayWithCapacity:, y añadiendo objetos a ella hasta que esté lleno, por lo que asigna toda la memoria a la vez si puede.

Detrás de las escenas, que son en secreto la misma cosa - NSArray y NSMutableArray están a implantarse con CFArray s a través de peaje de puente libre (un CFMutableArrayRef y una CFArrayRef son de de la misma cosa typedef, __CFArray *) *

NSArray y NSMutableArray deben tener el mismo rendimiento/complejidad (el tiempo de acceso es O (lg N) en el peor y O (1) en el mejor) y la única diferencia es la cantidad de memoria que usarían los dos objetos: NSArray tiene un límite fijo, mientras que NSMutableArray puede usar tanto espacio como libre.

Los comentarios en CFArray.h tienen muchos más detalles acerca de esto.

*: Como Catfish_Man señala a continuación, esto ya no es cierto.

+4

Tenga en cuenta que NSArray ya no se implementa en términos de CFArray (aunque fue hace cuatro años cuando se escribió esta respuesta) –

+0

¿Dónde ha leído sobre el rendimiento de la estructura de datos en el objetivo C? – George

+1

@George El rendimiento de las estructuras de datos en Objective-C es prácticamente el mismo que en otros idiomas. Si desea detalles específicos de la Fundación, http://ridiculousfish.com/blog/posts/array.html tiene algunas ideas, aunque los detalles específicos de las cosas han cambiado en la última década. – zadr

2

No se puede modificar NSArray una vez que se haya creado. Si necesita agregar/eliminar objetos de su matriz, entonces usará NSMutableArray - no hay muchas opciones para eso. Supongo que NSArray está optimizado para operaciones de matriz fija. La matriz mutable ofrece flexibilidad de ser modificable.

23

La diferencia de rendimiento del uso de NSArray frente a NSMutable array surge principalmente cuando utiliza una API que desea copiar la matriz. si envía -copy a una matriz inmutable, simplemente supera el conteo de retención, pero al enviar -copy a una matriz mutable se asignará la memoria de pila.

+0

Entonces, ¿cuál será más rápido ...? asignando memoria de montón o golpeando el conteo de retención ...? –

+2

Abordar el conteo de retención es mucho más rápido. – Minthos

14

Además, NSMutableArray no es threadsafe, mientras que NSArray es (lo mismo con todos los objetos mutables vs. "inmutables"). Esto podría ser un gran problema si eres multihilo.

9

La principal desventaja de NSMutableArray es que un objeto que posee un NSMutableArray puede tener el conjunto cambiado detrás de su parte posterior si otro objeto también lo posee. Esto puede requerir que codifique su objeto de manera más defensiva, persiguiendo menos agresivamente el rendimiento.

Si el NSMutableArray no está expuesto fuera del objeto, esto no es una preocupación.

es una mejor opción para compartir, precisamente porque es inmutable. Cada objeto que lo usa puede suponer que no cambiará, y no necesita hacer una copia defensiva de él.

Ésta es probablemente la misma razón que NSDictionary copias de sus llaves, en lugar de simplemente retenerlos: que necesita para asegurarse de que no van a mutar, y la copia es la única manera de garantizar que.

Cuestiones relacionadas