对象等同性是比对两个对象非常有用的功能。但一般情况 == 操作符比对出来的结果可能并不准确或并不是我们想要的,因为 == 比对的是两个指针本身,并不是指针所指的对象。
不如NSString类就有一个自己的对象等同性判断方法 isEqualToString:。这个方法比isEqual:执行速度更快,因为后者还需要判断对象类型,而isEqualToString:只能传入NSString类型。
NSObject协议中有两个用于判断对象等同性的方法
- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;
这两个方法的实现机制是,当且仅当指针完全相等时两个对象才相等。所以如果想重写这两个方法,如果isEqual:方法判断两个对象相等,那么hash方法也必须返回同一个值。
比如以下这个例子:
有Person这个类
我们如果认为Person的firstName,lastName,age都相等,那么两个Person的对象就相等,那么isEqual:方法就可以写成:
接下来实现hash方法。因为两个对象的hash算法以属性值的唯一性来确保对象的差异性,也就是说,只要两个对象属性值一致,那这两个对象的就是相等的。NSObject自带的hash方法相当于hash表中的f(key)函数中的key,这“唯一”的key需要用户自己产生,至于用什么算法由用户自己决定,所以,只要我们规定一种不会产生重复hash码的方法即可。
比如
使用hash方法,所以我们的isEqual:方法就可以写成
大功告成。