为什么 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:
比较对象标识,而不是 hash
。 hash
允许集合使用来加速比较,但这只是一种优化。如果两个对象 return YES
对于 isEqual:
它们也必须 return 相同 hash
,但反之则不然。
要使用对象作为NSSet的元素,NSDictionary的键等,需要实现hash方法和isEqual:方法。如果您没有自己的实现,散列 returns 对象指针和 isEqual 比较对象指针,一切都会正常工作。
如果您自己实现了 hash 和 isEqual:,您必须确保两件事:1. 当对象在集合中时,哈希值和 isEqual 的结果大部分不会改变(改变存储在集合中的 NSMutableString NSSet 将是一个非常糟糕的主意)。 2. hash和isEqual:必须一致:比较相等的两个对象必须return相同的hash值。
我有一个 NSMutableSet
集合,其中包含作为 SKNode
子类的自定义对象。我正在制作一个游戏,其中将这些对象添加到 NSMutableSet 中并从中删除。我在主线程中添加和删除,所以线程不是问题。出于某种原因,有时一个对象不会被删除,因为它找不到。下面的方法returnsNO
:
[self.set containsObject:object]
我查看了这个问题并打印了对象的地址和哈希值以及 NSMutableSet
中的所有对象,果然它出现在集合中。
如果地址和散列数相等,找不到对象的原因可能是什么?我知道 containsObject
方法使用 isEqual
来比较这两个值。
hash
的结果必须等于 而 isEqual:
的结果必须等于 YES
。仅仅匹配散列是不够的。你检查过isEqual:
了吗?默认 isEqual:
比较对象标识,而不是 hash
。 hash
允许集合使用来加速比较,但这只是一种优化。如果两个对象 return YES
对于 isEqual:
它们也必须 return 相同 hash
,但反之则不然。
要使用对象作为NSSet的元素,NSDictionary的键等,需要实现hash方法和isEqual:方法。如果您没有自己的实现,散列 returns 对象指针和 isEqual 比较对象指针,一切都会正常工作。
如果您自己实现了 hash 和 isEqual:,您必须确保两件事:1. 当对象在集合中时,哈希值和 isEqual 的结果大部分不会改变(改变存储在集合中的 NSMutableString NSSet 将是一个非常糟糕的主意)。 2. hash和isEqual:必须一致:比较相等的两个对象必须return相同的hash值。