为什么NSOrderedMutableSet添加数据相同的对象?

时间:2012-06-26 19:40:58

标签: objective-c cocoa nsmutableset

我正在使用-[NSOrderedMutableSet addObject:]创建对象并将它们添加到集合中,但我发现只检查对象本身的重复项 - 可能是对象指针的地址,并且可以添加多个对象内容相同的。

例如:

SomeObject* object = [SomeObject alloc] initWithStuff:stuff];
SomeObject* object2 = [SomeObject alloc] initWithStuff:stuff];

[set addObject:object];
[set addObject:object];
[set addObject:object1];
[set addObject:object2];

计数为2。

这让我想知道这些课程的重点是什么?在什么情况下可能有一个对象而不知道对象本身是否已经添加到集合中,而不是对象中包含的数据?

最简单的方法(或者我应该使用哪个类)是什么用来确保集合只包含基于内容的每个对象中的一个?

2 个答案:

答案 0 :(得分:4)

您正在寻找的方式是正确的方法,您忘记了一个小细节:NSMutableOrderedSet类如何知道SomeObject的哪些实例包含相同的值?

答案很简单:您必须提供自己的

实现
- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash

因此,与相同的内部值相比,您的实例将返回true,并且具有相同数据的两个实例将具有相同的哈希码。

除了这些集合之外,它们非常有用,因为它们可以让您在检查实例是否包含在集合中时更加复杂,并且可以快速对它们执行许多逻辑运算,如交集,并集,差异等等。 / p>

答案 1 :(得分:1)

如果它是您拥有的自定义对象,则必须实现自己的isEqual:和hash方法来检查相等性并防止集合中出现重复。