NSSet 不包含对象,即使它们是相等的



Person类:

@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@end

我重写是isEqual:方法:

- (BOOL)isEqual:(id)object {
    Person *person = (Person *)object;
    return [self.name isEqualToString:person.name];
}

然后我进行了测试:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    Person *p1 = [[Person alloc] init];
    p1.name = @"Jack";
    Person *p2 = [[Person alloc] init];
    p2.name = @"Jack";
    if ([p1 isEqual:p2]) {
        NSLog(@"p1 isEqual p2");
    } else {
        NSLog(@"p1 not Equal p2");
    }
    NSMutableSet *set = [NSMutableSet set];
    [set addObject:p1];
    if ([set containsObject:p2]) {
        NSLog(@"contain p2");
    } else {
        NSLog(@"not contain p2");
    }
}

控制台打印:

p1 isEqual p2
not contain p2

关于方法containsObject:

与AnObject一起检查集合的每个元素,直到找到匹配或达到集合的末端为止。如果是等于:返回是。

,将对象视为平等。

所以我现在有点困惑:

现在p1等于p2,为什么该集合不包含 p2

来自nsObject协议的文档:

如果两个对象相等,则必须具有相同的哈希值。这 最后一点特别重要,如果您定义iSqual:在 子类并打算将该子类的实例放入 收藏。确保您还在子类中定义哈希。

最新更新