如何比较Objective-C中的对象?

Tal*_*ode 23 objective-c

如何比较自定义类的两个对象?我的想法是在类中添加一个额外的方法,我可以在其中将当前对象与同类的另一个对象进行比较.

所以我可以编写自己的代码,比较每个类的字段.

我就是这样做的.或者有一些预定义的方法来做到这一点?像NSString类的"isEqualTo"?

Rob*_*ier 54

该指针-isEqual:是好的,但如果你实现-isEqual:,你绝对必须还实现了-hash以这样一种方式,如果两个物体返回YES-isEqual:他们也将返回相同的值-hash.当您使用像NSArray这样的集合时,实现isEqual:而不实现-hash会导致一些非常令人惊讶的错误.

对于新开发人员,我倾向于建议不要重载-isEqual:.我建议使用与NSString相同的技术,并创建一个自定义-isEqualToFoo:(Foo您的类在哪里),直到您了解-isEqual:对集合的影响,特别是想要这种行为.重载-isEqual:功能强大,但您可以创建的错误是微妙的.在许多情况下,创建自己的自定义比较器更安全,更清晰.

  • @LucasTizma你需要实现`hash`,因为它用于优化.`isEqual:`可能非常昂贵.考虑一个巨大的`NSString`.你必须比较每个角色.相反,你首先检查`hash`.这是一个简单的数字,因此比较非常快,对于类似桶的数据结构,您已经计算过了.如果哈希值相等,那么只有`isEqual:`被调用.两个不相等的东西可以使用相同的哈希,最简单的法律哈希方法是`return 1;`.但是如果存在许多相等性检查并且`isEqual:`很昂贵,这会损害性能. (7认同)

pgb*_*pgb 6

标准方法是覆盖- (BOOL)isEqual:(id)anObject- (NSUInteger)hash.

您应该阅读NSObject协议的文档,这个 SO问题有一些关于如何编写哈希方法的有趣答案.