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
?
答案 0 :(得分:2)
来自documentation for the NSObject protocol:
如果两个对象相等,则它们必须具有相同的哈希值。这个 最后一点在定义isEqual时特别重要: 子类,并打算将该子类的实例放入 采集。确保您还在子类中定义哈希。