Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 为什么要添加数据相同的对象?_Objective C_Cocoa_Nsmutableset - Fatal编程技术网

Objective c 为什么要添加数据相同的对象?

Objective c 为什么要添加数据相同的对象?,objective-c,cocoa,nsmutableset,Objective C,Cocoa,Nsmutableset,我正在创建对象并使用-[SensorDeredMutableSet addObject:]将它们添加到一个集合中,但我发现只检查对象本身的重复项—对象指针的地址,并且可以添加具有相同内容的多个对象 例如: SomeObject* object = [SomeObject alloc] initWithStuff:stuff]; SomeObject* object2 = [SomeObject alloc] initWithStuff:stuff]; [set addObject:object

我正在创建对象并使用-[SensorDeredMutableSet 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

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


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

您现在看到的方法是正确的,您忘记了一个小细节:NSMutableOrderedSet类如何知道某个对象的哪些实例包含相同的值

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

- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash
因此,当与相同的内部值进行比较时,实例将返回true,并且具有相同数据的两个实例将具有相同的哈希代码


除此之外,这些集合非常有用,因为它们使您在检查实例是否包含在集合中时具有更好的复杂性,并且您可以快速对它们执行许多逻辑操作,如交集、并集、差分等等。

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

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

- (BOOL)isEqual:(id)anObject
- (NSUInteger)hash
因此,当与相同的内部值进行比较时,实例将返回true,并且具有相同数据的两个实例将具有相同的哈希代码


除此之外,这些集合非常有用,因为它们使您能够更复杂地检查实例是否包含在集合中,并且您可以快速地对它们执行许多逻辑操作,如交集、并集、差集等等。

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

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

可能重复的可能重复的感谢-他们应该将该部分添加到NSMutableOrderedSet的文档中,除了removeObjectsInArray之外,任何地方都不会提到它!非常无用的文档。@Chris:Apple不在子类中重复信息;您可以在或中找到isEqual:和hash:的提及。NSSet的文档称为参考NSObject的文档进行hash,但NSObject文档中根本没有提到hash。哦,我想我可以在谷歌上找到一些例子。CHeers@Chris:和作为NSObject协议中的NSSet文档状态。文档中的大多数方法名称都是可单击的链接。谢谢-他们应该将该部分添加到NSMutableOrderedSet的文档中,除了removeObjectsInArray之外,任何地方都没有提到它!非常无用的文档。@Chris:Apple不在子类中重复信息;您可以在或中找到isEqual:和hash:的提及。NSSet的文档称为参考NSObject的文档进行hash,但NSObject文档中根本没有提到hash。哦,我想我可以在谷歌上找到一些例子。CHeers@Chris:和作为NSObject协议中的NSSet文档状态。文档中的大多数方法名称都是可单击的链接。