2012-11-07 18 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存在於集合中,則爲YES,否則爲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 Collections中正確使用。

NSSet平等不會工作的原因,是因爲集使用哈希(它保存爲一個哈希表),因此,如果你只實現isEqual:,然後那裏有一個機會(一個很好的機會),他們的哈希值會有所不同。

+0

啊,輝煌,謝謝! – Adam

6

NSSet是傳統意義上設置一個哈希,所以你必須實現hash方法,以確保爲o對象被認爲是平等的。默認情況下,hash只是簡單地將被轉換對象的指針返回爲無符號整數,這對於每個對象都是唯一的,所以即使對象isEqual:返回true也不會被識別爲這樣。如果您對NSSet的工作感興趣,您可以查看CFSet source code,這是NSSet的免費橋接Core Foundation計數器部分。