2010-06-10 5 views
4

Je travaille actuellement sur une application qui affiche un tas de fichiers dans une table, et vous pouvez les ajouter et les supprimer et quoi que ce soit. Pour éviter les doublons dans la table, je voudrais créer un NSDictionary en utilisant le chemin complet des fichiers comme clés pour un autre NSDictionary qui contient toutes les informations du fichier, mais je suis un peu préoccupé par la longueur maximale de la clé NSDictionary, et aussi si solution serait tueur de performance ou pas ...Quelle est la longueur maximale de la clé dans NSDictionary?

Répondre

9

Il n'y a pas de limites spécifiques sur la taille de NSString que vous utilisez tant qu'il n'est pas si grand que vous remplissez toute la mémoire! Le dictionnaire ne charge pas les caractères et commence à les regarder lui-même afin qu'il n'y ait aucun problème interne de NSDictionary lié à cela, ou des problèmes de performance, car tout ce qu'il fait est d'utiliser la méthode isEqual: et s'il retourne vrai, il allumettes.

Espérons que ça aide.

+0

Eh bien, 'hash', aussi, plus le protocole NSCopying. Mais tout cela dépend des objets clés à implémenter, et les objets clés n'ont même pas besoin d'avoir une notion de longueur: vous pouvez utiliser des objets copiables, lavables et comparables comme clés. Les NSStrings ont une longueur, et ont cette limite de longueur pratique, mais ils n'ont pas de limite explicitement définie; leurs longueurs sont illimitées en principe. –

1

Il n'y a pas de maximum théorique. De plus, je ne m'inquiéterais pas des performances avant d'avoir déterminé que c'est vraiment un problème.

2

Il n'y a pas de maximum, sauf peut-être la longueur maximale de NSString, qui est théoriquement illimitée/UIntMax. L'interface NSDictionary nécessite l'indexation via les méthodes -hash et -isEqual: implémentées par n'importe quel objet utilisé comme clé, pour permettre aux clés d'être quelque chose, pas seulement NSStrings. Bien sûr, NSString implémente les deux fonctions, mais ce n'est pas le cas - le hachage est un int, donc il revient à NSString de trouver un moyen de transformer son contenu en entier - il n'a pas à le faire physiquement) être unique, juste répétable (renvoyant le même résultat à chaque fois). Voir here pour plus de détails sur le hachage. Fondamentalement, cela signifie que chaque NSString - n'importe quel objet, vraiment - peut avoir un hachage. Par conséquent, si vous pouvez le stocker dans un NSString, il n'y a pas de limite pour le mettre dans un NSDictionary. Aussi, ne vous inquiétez pas de la performance/dictionnaires de dictionnaires sont une conception parfaitement valide et sont assez rapides pour être applicables.

+0

Les clés ne peuvent être rien, elles doivent être conformes au protocole 'NSCopying', et la valeur de hachage ne doit pas reposer sur des caractéristiques mutables de l'objet. – dreamlax

3

Il n'y a pas de limite spécifique. Une condition préalable pour les dictionnaires est que la clé doit être conforme au protocole NSCopying. Lorsque vous insérez une paire clé-valeur dans un dictionnaire, le dictionnaire crée une copie de l'objet clé pour s'assurer qu'il ne mute pas à l'intérieur du dictionnaire. Il utilise la valeur de hachage de l'objet clé pour déterminer où le commander en interne. Si l'objet a muté pendant qu'il était dans le dictionnaire, il aurait jeté la commande et le dictionnaire ne fonctionnerait pas, c'est pourquoi le dictionnaire fait une copie (bien que comme optimisation, quand des objets immuables tels que NSString sont demandés pour une copie , il pourrait simplement augmenter le nombre de retenue et retourner lui-même, mais ceci est un détail d'implémentation).

Comme les clés doivent être conformes au protocole NSCopying, cela signifie que vous pouvez utiliser un certain nombre d'objets comme les clés à un dictionnaire, y compris NSArray, NSData, etc. Ne vous inquiétez pas sur les performances de l'utilisation de grandes chaînes dans NSDictionary collections à moins que vous avez découvert que c'est en fait un goulot d'étranglement.

Questions connexes