Question

J'ai une classe qui enroule autour d'un objet, NSMutableSet et moi avons une méthode d'instance qui ajoute des objets (en utilisant la méthode de addObject:) au NSMutableSet.

Cela fonctionne bien, mais je sent un attelage de performance, car l'intérieur de la méthode que je vous appelle explicitement containsObject: avant d'ajouter l'objet à l'ensemble.

Troisième partie question:

  1. Dois-je besoin d'être appeler containsObject: avant d'ajouter un objet à l'ensemble?
  2. Si oui, alors quelle méthode réelle devrais-je utiliser, containsObject ou containsObjectIdenticalTo:?
  3. Si ce n'est pas, de quelle façon contains obtient invoquaient sous le capot de addObject:? Ceci est important pour moi parce que si je passe un objet à containsObject: il retournerait vrai, mais si je passe à containsObjectIdenticalTo: il retournerait faux.
Était-ce utile?

La solution

Si vous enroulant un NSMutableSet, puis en appelant containsObject: est inutile, car un ensemble ( par définition ) ne contient pas de doublons. Ainsi, si vous essayez d'insérer un objet qui est déjà dans l'ensemble, rien ne se passera.

En ce qui concerne une baisse de performance va, ne vous inquiétez pas à ce sujet à moins que vous mesurez réellement être un problème. Je serais très très surpris si vous même pu, car un ensemble (au moins, une mise en œuvre intelligente d'un ensemble) a O (1) recherche de temps (cas en moyenne). Je vous garantis que NSSet et les amis sont des implémentations intelligentes. :)

D'après ce que j'ai compris au sujet de la mise en œuvre de NSSet, il est l'invocation -hash sur les objets comme un moyen de les « groupe » dans les poubelles si vous utilisez containsObject: ou addObject:. Si vous utilisez containsObjectIdenticalTo:, il va encore utiliser -hash pour affiner le processus de recherche, puis (essentiellement) faire des comparaisons de pointeur pour trouver l'objet identique.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top