为什么 NSMutableSet 不删除其中包含的对象?

Why doesn't NSMutableSet remove an object contained in it?

我有一个 NSMutableSet 集合,其中包含作为 SKNode 子类的自定义对象。我正在制作一个游戏,其中将这些对象添加到 NSMutableSet 中并从中删除。我在主线程中添加和删除,所以线程不是问题。出于某种原因,有时一个对象不会被删除,因为它找不到。下面的方法returnsNO:

[self.set containsObject:object]

我查看了这个问题并打印了对象的地址和哈希值以及 NSMutableSet 中的所有对象,果然它出现在集合中。

如果地址和散列数相等,找不到对象的原因可能是什么?我知道 containsObject 方法使用 isEqual 来比较这两个值。

hash 的结果必须等于 isEqual: 的结果必须等于 YES。仅仅匹配散列是不够的。你检查过isEqual:了吗?默认 isEqual: 比较对象标识,而不是 hashhash 允许集合使用来加速比较,但这只是一种优化。如果两个对象 return YES 对于 isEqual: 它们也必须 return 相同 hash,但反之则不然。

要使用对象作为NSSet的元素,NSDictionary的键等,需要实现hash方法和isEqual:方法。如果您没有自己的实现,散列 returns 对象指针和 isEqual 比较对象指针,一切都会正常工作。

如果您自己实现了 hash 和 isEqual:,您必须确保两件事:1. 当对象在集合中时,哈希值和 isEqual 的结果大部分不会改变(改变存储在集合中的 NSMutableString NSSet 将是一个非常糟糕的主意)。 2. hash和isEqual:必须一致:比较相等的两个对象必须return相同的hash值。