iphone - ¿Desventaja de usar NSMutableArray vs NSArray?
cocoa cocoa-touch (5)
Además, NSMutableArray no es seguro para los hilos, mientras que NSArray es (lo mismo con todos los objetos mutables que con los objetos "inmutables"). Esto podría ser un gran problema si eres multihilo.
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?
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.
La diferencia de rendimiento del uso de NSArray versus NSMutable array surge principalmente cuando se usa una API que quiere 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.
La principal desventaja de NSMutableArray
es que un objeto que posee un NSMutableArray
puede tener el conjunto cambiado detrás de su espalda 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 NSMutableArray
no está expuesto fuera del objeto, esto no es una preocupación.
NSArray
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.
Esta es probablemente la misma razón por la que NSDictionary
copia sus claves, en lugar de simplemente retenerlas: necesita estar seguro de que no mutarán, y copiar es la única manera de garantizar eso.
No puede modificar NSArray
una vez que se haya creado. Si necesita agregar / eliminar objetos de su matriz, usará NSMutableArray
, no hay muchas opciones para eso. Supongo que NSArray
está optimizado para operaciones de arreglos fijos. La matriz mutable ofrece flexibilidad de ser modificable.
Si está cargando objetos desde una base de datos y sabe exactamente cuántos objetos tiene, es probable que obtenga el mejor rendimiento del NSMutableArray
arrayWithCapacity:
y agregue objetos hasta que esté lleno, de modo que asigne toda la memoria de una vez si puede.
Detrás de escena, secretamente son lo mismo: * NSArray
y NSMutableArray
se implementan con CFArray
a través de un puente gratuito (un CFMutableArrayRef
y un CFArrayRef
son typedef de la misma cosa, __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 de los casos) y la única diferencia es la cantidad de memoria que usarán los dos objetos: NSArray
tiene un límite fijo, mientras que NSMutableArray
puede usar todo el espacio que tenga libre.
Los comentarios en CFArray.h tienen muchos más detalles sobre esto.
*: Como Catfish_Man señala a continuación, esto ya no es cierto.