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

时间:2019-05-11 08:46:35

标签: objective-c 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的相等性,直到找到匹配项或到达集合的末尾。如果isEqual,则认为对象相等:返回YES。

所以我现在有点困惑:

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

1 个答案:

答案 0 :(得分:2)

来自documentation for the NSObject protocol

  

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