在比较期间,每次都不会调用覆盖isEqual方法

时间:2015-02-21 18:27:38

标签: ios objective-c

我有一个名为

的班级
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

1 个答案:

答案 0 :(得分:7)

请阅读Reference Library中有关NSObject协议中isEqual:的讨论。

您会发现,对于集合内部的对象(例如NSArray),可能会使用hash来确定两个对象是否实际相同。如果两个指针实际指向同一个对象,则无需检查是否相等 - 因此isEqual:永远不会被调用。

参考库建议的解决方案是在子类中实现hash