Документация по методу NSMutableSet addObject:
, используемая для покрытия аналогичного случая:
Если anObject
уже присутствует в наборе, этот метод не влияет ни на набор, ни на anObject
.
Но, как видно из ссылки, текущая версия даже не говорит этого. И даже это утверждение действительно охватывает только попытки добавить один и тот же объект; в нем конкретно не говорится о добавлении другого, но равного объекта.
Полагаться на наблюдаемое, но не документированное поведение опасно не только потому, что оно может меняться в зависимости от версии ОС, но и потому, что оно может меняться в одном и том же процессе. Это потому, что NSSet является кластером класса , что означает, что может быть несколько реализаций. Какой из них вы получите, зависит от того, как вы создали набор; нет способа гарантировать, что конкретная реализация будет выбрана или даже существует. *
Это потому, что это не должно иметь значения. Каждый из кластерных подклассов имеет такое же поведение, как определено в интерфейсе и документации кластера. (Если этого не произойдет, это ошибка, и вы должны сообщить об этом .) Учитывая, что все подклассы фактически выполняют одни и те же действия, не должно иметь значения, какой экземпляр вы получите.
Тот же принцип применим к вашим объектам. Они равны! По этой причине не должно иметь значения, какой из них находится в наборе. Если это имеет значение, то они на самом деле не равны, и вам нужно сделать определение равенства объектов более жестким. (Не забудьте обновить isEqual:
и hash
.)
В зависимости от того, для чего вы используете набор, вы можете захотеть сделать это еще дальше и убедиться, что не может быть двух одинаковых объектов. Для этого переместите владение, обслуживание и использование набора в класс объектов-членов и пусть он всегда возвращает соответствующий объект вместо создания нового, когда это возможно и уместно.
* И даже если бы вы могли выбрать одну из реализаций, нет никакой гарантии, что она будет иметь поведение, которое вы наблюдали вечно - возможно, и Мерфи говорит, что, вероятно, будет другим в другой версии ОС.