1

我正在使用创建对象并将它们添加到集合中-[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。

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

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

4

2 回答 2

4

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

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

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

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

除此之外,集合相当有用,因为它们在检查实例是否包含在集合中时给您提供了更好的复杂性,并且您可以快速对它们执行许多逻辑操作,例如交集、联合、差异等等。

于 2012-06-26T19:49:44.513 回答
1

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

于 2012-06-26T19:50:23.450 回答