Вопрос

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

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

Три часть Вопрос:

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

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top