2012-09-22 60 views
0
- (void)removeObjectsInArray:(NSArray *)otherArray 

從接收數組中刪除另一個給定數組中的對象。 此方法與removeObject:類似,但允許您通過單個操作有效地移除大量對象。如果接收的 數組不包含otherArray中的對象,則該方法不起作用 (儘管它會招致搜索內容的開銷)。這個 方法假定其他陣列中的所有元素都響應散列和 isEqual :.爲什麼removeObjectsinArray需要散列?

我明白removeObjectsinArray的isEqual需要

爲什麼它需要或者實施對象?

回答

3

NSObject documentation

如果兩個對象是相等的,它們必須具有相同的哈希值。如果您在 子類中定義isEqual:並且打算將該子類的實例放入 集合中,則此最後一點尤其重要。確保你也在你的子類中定義了散列。

如果您覆蓋-isEqual:,建議也覆蓋-hash。所以這是第一個原因 - 他們不會在-removeObjectsInArray:文檔中提出相同的建議不一致。

第二個原因更爲微妙。作爲一名經驗豐富的開發人員,您可以假設-hash不會用於執行-removeObjectsInArray:(或通過實驗發現),並且您可以避免在對象上實現它。然而,蘋果公司明確表示,如果他們覺得這是值得優化的,並且應該實施以防萬一,他們保留在其實施中使用-hash的權利

(我不知道他們是否會將其當前實現)

+0

值得一提的是與最近的iOS版本(6.0?)開始,蘋果公司現在使用'-hash'表演時'-removeObjectsInArray :'他們以前沒有的地方。這就破壞了我們的代碼,因爲我們錯誤地假設了,就像你所說的一樣! –