33 votes

Inconvénient de l'utilisation de NSMutableArray par rapport à NSArray ?

J'utilise un tableau pour stocker des objets en cache chargés à partir d'une base de données dans mon application iPhone et je me demandais si l'utilisation de NSMutableArray présentait des inconvénients majeurs que je devrais connaître.

edit : Je sais que NSMutableArray peut être modifié, mais je cherche des raisons spécifiques (performance, etc..) pour lesquelles on utiliserait NSArray à la place. Je suppose qu'il y aurait une différence de performance, mais je n'ai aucune idée si elle est significative ou non.

50voto

zadr Points 1752

Si vous chargez des objets depuis une base de données et que vous connaissez exactement le nombre d'objets que vous avez, vous obtiendrez probablement les meilleures performances avec NSMutableArray s arrayWithCapacity: et en y ajoutant des objets jusqu'à ce qu'elle soit pleine, de sorte qu'elle alloue toute la mémoire en une seule fois si elle le peut.

En coulisses, ils sont secrètement la même chose - NSArray et NSMutableArray sont toutes deux mises en œuvre avec CFArray par le biais d'une passerelle gratuite (a CFMutableArrayRef et un CFArrayRef sont des définitions de la même chose, __CFArray * ) *

NSArray et NSMutableArray devraient avoir les mêmes performances/complexité (le temps d'accès étant O(lg N) au pire et O(1) au mieux) et la seule différence étant la quantité de mémoire que les deux objets utiliseraient - NSArray a une limite fixe, tandis que NSMutableArray peut utiliser autant d'espace que vous avez de libre.

Les commentaires dans CFArray.h ont beaucoup plus de détails à ce sujet.

* : Comme Catfish_Man le souligne ci-dessous, ce n'est plus vrai.

25voto

NSResponder Points 14459

La différence de performance entre l'utilisation de NSArray et de NSMutable array survient principalement lorsque vous utilisez une API qui veut copier le tableau. Si vous envoyez -copy à un tableau immuable, cela ne fait qu'augmenter le nombre de retenues, mais envoyer -copy à un tableau mutable allouera de la mémoire de tas.

14voto

Matthew Frederick Points 14932

En outre, NSMutableArray n'est pas threadsafe, alors que NSArray l'est (il en va de même pour tous les objets mutables et "immuables"). Cela peut être un énorme problème si vous êtes en multithreading.

9voto

Steven Fisher Points 22249

Le principal inconvénient de NSMutableArray est qu'un objet possédant un NSMutableArray peut voir le tableau modifié dans son dos si un autre objet le possède également. Cela peut vous obliger à coder votre objet de manière plus défensive, moins agressive dans la chasse aux performances.

Si le NSMutableArray n'est pas exposé en dehors de l'objet, ce n'est pas un problème.

NSArray est un meilleur choix pour le partage, précisément parce qu'il est immuable. Chaque objet qui l'utilise peut supposer qu'il ne changera pas, et n'a pas besoin d'en faire une copie de manière défensive.

C'est probablement pour la même raison que NSDictionary copie ses clés, plutôt que de simplement les conserver : il doit être sûr qu'elles ne vont pas muter, et la copie est le seul moyen de le garantir.

2voto

stefanB Points 27796

Vous ne pouvez pas modifier NSArray une fois qu'il est créé. Si vous avez besoin d'ajouter/supprimer des objets de votre tableau, vous utiliserez la fonction NSMutableArray - pas beaucoup d'options pour ça. Je suppose NSArray est optimisé pour les opérations sur les tableaux fixes. Les tableaux mutables offrent la flexibilité d'être modifiables.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X