我有一个名为
的班级Contact;
在Contact
我有(simple version to test, no hash yet)
- (BOOL)isEqual:(id)other {
if (other == self)
return YES;
if (!other || ![other isKindOfClass:[self class]])
return NO;
return NO;
}
我做:
NSMutableArray *arr = [[NSMutableArray alloc] init];
Contact *contact = [Contact new];
[arr addObject:contact]
// I expect my isEqual to be called here but it does not get called
[arr containsObject:contact] // this evaluates to true somehow!!!
但是,如果我添加另一个对象来键入NSString
,那么它将被调用以比较String对象而不是联系对象。这意味着
[arr addObject:@""] // so now arr has two elements
// here I expect two calls to isEqual but only one gets there
// when comparing string object against Contact
[arr containsObject:contact]
为什么在我上面提到的情况下没有调用isEqual
?
答案 0 :(得分:7)
请阅读Reference Library中有关NSObject协议中isEqual:
的讨论。
您会发现,对于集合内部的对象(例如NSArray),可能会使用hash
来确定两个对象是否实际相同。如果两个指针实际指向同一个对象,则无需检查是否相等 - 因此isEqual:
永远不会被调用。
参考库建议的解决方案是在子类中实现hash
。