NSMutableSet addObject
-
08-10-2019 - |
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:
- Dois-je besoin d'être appeler
containsObject:
avant d'ajouter un objet à l'ensemble? - Si oui, alors quelle méthode réelle devrais-je utiliser,
containsObject
oucontainsObjectIdenticalTo:
? - Si ce n'est pas, de quelle façon
contains
obtient invoquaient sous le capot deaddObject:
? Ceci est important pour moi parce que si je passe un objet àcontainsObject:
il retournerait vrai, mais si je passe àcontainsObjectIdenticalTo:
il retournerait faux.
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.