Objective c NSMutableSet允许添加具有相同哈希的多个对象

Objective c NSMutableSet允许添加具有相同哈希的多个对象,objective-c,Objective C,我有一个NSObject子类,在其中我实现了isEqual:和hash方法,用于测试目的: - (BOOL)isEqual:(id)anObject { return YES; } - (NSUInteger)hash { return 1; } 出于某种原因,我可以将此类的多个对象添加到NSMutableSet,即使它们是“相同的”。有没有什么理由这不起作用 更新:原来我是在给NSMutableSet类型的ivar分配一个NSMutableArray实例。哦 addObj

我有一个NSObject子类,在其中我实现了
isEqual:
hash
方法,用于测试目的:

- (BOOL)isEqual:(id)anObject {
    return YES;
}

- (NSUInteger)hash {
    return 1;
}
出于某种原因,我可以将此类的多个对象添加到NSMutableSet,即使它们是“相同的”。有没有什么理由这不起作用



更新:原来我是在给NSMutableSet类型的ivar分配一个NSMutableArray实例。哦

addObject方法返回
void
,不提供关于项目是否实际“添加”的反馈

-(void)addObject:(id)object

是否枚举集合以确定对象“添加了两次”?否则,是什么让你相信他们是

如果两个集合与
unionSet
联合在一起,如果两个集合包含相同的对象,是否会发生错误?或者结果应该仅仅包含两个原始集合包含的相同对象吗

如果您要合并一组恰好包含一个项目的集合,该怎么办?因为如果你同意上面的话,你就会明白我为什么说下面的话


我认为它只是默默地吞下了第二次添加对象的尝试(它应该是这样的)并继续生活。

你的代码中肯定还有其他地方做得不对,因为你在OP中显示的重写方法会导致
NSMutableSet
将我的对象识别为相同的:

测试h:

#import "Foundation/Foundation.h"
@interface Test : NSObject
@end
测试m:

#import "Test.h"
@implementation Test
- (BOOL)isEqual:(id)anObject {
    return YES;
}
- (NSUInteger)hash {
    return 1;
}
@end
主要条款c:

#include <CoreFoundation/CoreFoundation.h>
#import "Test.h"
int main (int argc, const char * argv[]) {
    Test *t1 = [[Test alloc] init];
    Test *t2 = [[Test alloc] init];
    Test *t3 = [[Test alloc] init];
    Test *t4 = [[Test alloc] init];
    NSSet *s = [NSMutableSet setWithObjects:t1, t2, t3, t4, nil];
    NSLog(@"%lu", s.count);
    return 0;
}
#包括
#导入“Test.h”
int main(int argc,const char*argv[]{
Test*t1=[[Test alloc]init];
Test*t2=[[Test alloc]init];
Test*t3=[[Test alloc]init];
测试*t4=[[Test alloc]init];
NSSet*s=[NSMutableSet setWithObjects:t1、t2、t3、t4、nil];
NSLog(@“%lu”,s.count);
返回0;
}

此代码段按预期生成
1

添加相同的对象不会导致错误,只是不会更改集合。