Pregunta

Tengo una clase que se envuelve alrededor de un objeto NSMutableSet, y tengo un método de instancia que añade objetos (usando el método addObject:) a la NSMutableSet.

Esto funciona bien, pero estoy oliendo un enganche de rendimiento, ya que dentro del método que estoy llamando explícitamente containsObject: antes de añadir el objeto al conjunto.

Tres cuestión parte:

  1. ¿Necesito estar llamando containsObject: antes de agregar un objeto al conjunto?
  2. Si es así, entonces, ¿qué método real debería estar utilizando, containsObject o containsObjectIdenticalTo:?
  3. Si no es así, ¿qué método se invoca contains bajo el capó de addObject:? Esto es importante para mí, porque si me pasa un objeto a containsObject: volvería cierto, pero si lo paso a containsObjectIdenticalTo: volvería falsa.
¿Fue útil?

Solución

Si está pasando un NSMutableSet, a continuación, invocando containsObject: es innecesario, ya que un conjunto ( por definición ) no contiene duplicados. Como tal, si se intenta insertar un objeto que ya está en el conjunto, no pasará nada.

En cuanto a un impacto en el rendimiento va, no se preocupe de ella a menos que realmente mida siendo un problema. Estaría muy muy muy sorprendido si es que se podía, porque un conjunto (al menos, una aplicación inteligente de un conjunto) tiene O (1) tiempo de búsqueda (caso promedio). Les garantizo que NSSet y amigos son implementaciones inteligentes. :)

A partir de lo que he reunido acerca de la implementación de NSSet, está invocando -hash en los objetos como una forma de "grupo" de ellos en contenedores de si se utiliza o containsObject: addObject:. Si utiliza containsObjectIdenticalTo:, todavía va a utilizar -hash para reducir el proceso de búsqueda, y luego (esencialmente) no comparaciones puntero para encontrar el objeto idéntico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top