2012-11-07 2 views
4

Документы Apple в настоящее время НЕ ДОКУМЕНТЫ Концепция NSSet «идентичность».Как Apple внедрила NSSet?

У меня есть некоторые ошибки, которые, как представляется, исходят от кода Apple. Например, «[NSMutableSet minusSet]» никогда не работает для меня, как задокументировано, но я уверен, что это из-за «идентичности».

например. от: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSSet_Class/Reference/Reference.html#//apple_ref/occ/cl/NSSet

containsObject:

Возвращает логическое значение, указывающее, является ли присутствует в наборе данный объект.

ДА Если в наборе присутствует anObject, в противном случае NO.

Что это значит?

FYI вещи, которые я пробовал:

  1. реализованы "IsEqual:" по всем классам в наборе
  2. проверил, что все классы не являются таким же классом (подкласс/суперкласса путаницы)
  3. implementd NSCopying всех классов в наборе (никакого эффекта)

ответ

8

В какао, объект равенство выполняется с помощью isEqual:иhash:

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html

Из записок для isEqual::

Если два объекта равны, они должны иметь одинаковые хэш-значение. Этот последний момент особенно важен, если вы определяете isEqual: в подклассе и собираетесь помещать экземпляры этого подкласса в коллекцию. Убедитесь, что вы также определили хэш в своем подклассе.

Ваши подклассы должны будут реализовать оба эти, чтобы они возвращали одно и то же. Как только они это сделают, их можно правильно использовать в коллекциях Cocoa.

Причина ваше NSSet равенство не будет работать, потому, что наборы используют хэшей (он хранится в виде хэш-таблицы), следовательно, если вы только реализовать isEqual:, то Theres шанс (хороший шанс), что их хэши будут отличаться ,

+0

Ах, блестящий, спасибо! – Adam

6

NSSet не является хэш-набор в классическом смысле, так что вы должны реализовать метод hash, чтобы убедиться, что о bjects признаны равными. По умолчанию hash просто возвращает указатель объекта, отлитого в целое число без знака, которое является уникальным для каждого объекта, поэтому даже объекты, возвращающие true для isEqual:, не будут распознаваться как таковые. Если вас интересуют работы NSSet, вы можете ознакомиться с CFSet source code, который представляет собой бесплатную мостовую стойку Core Foundation от NSSet.

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

  • Нет связанных вопросов^_^