2010-10-18 4 views
4

У меня есть класс, который обертывает объект NSMutableSet, и у меня есть метод экземпляра, который добавляет объекты (используя метод addObject:) к NSMutableSet.NSMutableSet addObject

Это хорошо работает, но я чувствую запах производительности, потому что внутри метода я явно вызываю containsObject: перед добавлением объекта в набор.

Трехзначный вопрос:

  1. мне нужно называть containsObject:, прежде чем я добавить объект в наборе ли?
  2. Если да, то какой фактический метод я должен использовать, containsObject или containsObjectIdenticalTo:?
  3. Если это не так, то какой метод contains вызывается под капотом addObject:? Это важно для меня, потому что, если я передаю объект containsObject:, он вернет true, но если я передам его containsObjectIdenticalTo:, он вернет false.

ответ

8

Если вы обертывания NSMutableSet, то применение containsObject: не является необходимым, так как множество (by definition) не содержит дубликатов. Таким образом, если вы попытаетесь вставить объект, который уже находится в наборе, ничего не произойдет.

Что касается удара по производительности, не беспокойтесь об этом, если вы на самом деле не оцениваете его как проблему. Я был бы очень очень удивлен, если бы мог, потому что набор (по крайней мере, умная реализация набора) имеет O (1) время поиска (средний случай). Я гарантирую вам, что NSSet и друзья - это умные реализации. :)

Из того, что я собрал о реализации NSSet, это применение -hash на объектах как путь к «группе» их в контейнеры, если вы используете containsObject: или addObject:. Если вы используете containsObjectIdenticalTo:, он все равно будет использовать -hash, чтобы сузить процесс поиска, а затем (по существу) выполнить сравнения указателей, чтобы найти идентичный объект.

Смежные вопросы