gpt4 book ai didi

ios - 在比较期间每次都不会调用重写的 isEqual 方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:56:04 24 4
gpt4 key购买 nike

我有一个类叫

Contact;

Contact中我有(要测试的简单版本,还没有散列)

- (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??

最佳答案

请阅读 Reference Library 中 NSObject 协议(protocol)中关于 isEqual: 的讨论.

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

引用库建议的解决方案是在您的子类中也实现 hash

关于ios - 在比较期间每次都不会调用重写的 isEqual 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649583/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com