3

我有一个NSMutableSet包含自定义对象的集合,这些对象是SKNode. 我正在制作一个游戏,其中从 NSMutableSet 中添加和删除这些对象。我在主线程中添加和删除,所以线程不是问题。由于某种原因,有时一个对象不会因为找不到而被删除。以下方法返回NO

[self.set containsObject:object]

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

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

4

2 回答 2

4

要将对象用作 NSSet 的元素、NSDictionary 的键等,它们需要实现 hash 方法和 isEqual: 方法。如果您没有自己的实现,则 hash 返回对象指针, isEqual 比较对象指针,一切都会正常工作。

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

于 2015-04-16T17:35:07.090 回答
3

的结果hash必须相等,而的结果isEqual:必须是YES。仅匹配哈希是不够的。你检查过isEqual:吗?默认isEqual:比较对象身份,而不是hash. hash允许集合使用来加速比较,但这只是一种优化。如果两个对象返回YESisEqual:它们也必须返回相同的hash,但反之则不成立。

于 2015-04-16T17:34:09.240 回答