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

时间:2015-04-16 17:16:34

标签: ios objective-c nsmutableset

我有一个NSMutableSet集,其中包含自定义对象,这些对象是SKNode的子类。我正在制作一个游戏,在这个游戏中添加这些对象并从NSMutableSet中删除。我正在添加和删除主线程,因此线程不是问题。出于某种原因,有时候一个物体没有被移除,因为它无法找到。以下方法返回NO

[self.set containsObject:object]

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

如果地址和哈希值相等,那么找不到对象的原因是什么?我了解containsObject方法使用比较这两个值的isEqual

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

hash的结果必须等于 isEqual:的结果必须为YES。仅仅匹配哈希是不够的。你检查过isEqual:了吗?默认isEqual:比较对象标识,而不是hash。集合允许使用hash来加速比较,但这只是一种优化。如果两个对象为YES返回isEqual:,则它们也必须返回相同的hash,但相反的情况并非如此。