2010-10-18 11 views
4

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

Cela fonctionne bien, mais je sens un accroc de performance parce que dans la méthode j'appelle explicitement containsObject: avant d'ajouter l'objet à l'ensemble.

Troisième partie question:

  1. Dois-je être appeler containsObject: avant d'ajouter un objet à l'ensemble? Si oui, alors quelle méthode utiliser, containsObject ou containsObjectIdenticalTo:?
  2. Si ce n'est pas le cas, quelle méthode contains est invoquée sous le capot de addObject:? Ceci est important pour moi parce que si je passe un objet à containsObject: cela retournera vrai, mais si je le passe à containsObjectIdenticalTo: cela retournera faux.

Répondre

8

Si vous envelopper un NSMutableSet, invoquant alors containsObject: est inutile, car un ensemble (by definition) ne contient pas de doublons. En tant que tel, si vous essayez d'insérer un objet qui est déjà dans l'ensemble, rien ne se passera.

En ce qui concerne les performances, ne vous en faites pas, à moins que vous ne le mesuriez réellement. Je serais très très très surpris si vous pouviez même, car un ensemble (au moins, une implémentation intelligente d'un ensemble) a O (1) temps de recherche (cas moyen). Je vous garantis que NSSet et ses 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 en invoquant -hash sur les objets comme un moyen de les « groupe » dans les poubelles si vous utilisez containsObject: ou addObject:. Si vous utilisez containsObjectIdenticalTo:, il utilisera toujours -hash pour affiner le processus de recherche, puis (essentiellement) faire des comparaisons de pointeurs pour trouver l'objet identique.