对象等同性 ——[isEqual]方法的实现

对象等同性是比对两个对象非常有用的功能。但一般情况 == 操作符比对出来的结果可能并不准确或并不是我们想要的,因为 == 比对的是两个指针本身,并不是指针所指的对象。

不如NSString类就有一个自己的对象等同性判断方法 isEqualToString:。这个方法比isEqual:执行速度更快,因为后者还需要判断对象类型,而isEqualToString:只能传入NSString类型。

NSObject协议中有两个用于判断对象等同性的方法

- (BOOL)isEqual:(id)object;

- (NSUInteger)hash;

这两个方法的实现机制是,当且仅当指针完全相等时两个对象才相等。所以如果想重写这两个方法,如果isEqual:方法判断两个对象相等,那么hash方法也必须返回同一个值。

比如以下这个例子:

有Person这个类

对象等同性 ——[isEqual]方法的实现_第1张图片

我们如果认为Person的firstName,lastName,age都相等,那么两个Person的对象就相等,那么isEqual:方法就可以写成:

对象等同性 ——[isEqual]方法的实现_第2张图片

接下来实现hash方法。因为两个对象的hash算法以属性值的唯一性来确保对象的差异性,也就是说,只要两个对象属性值一致,那这两个对象的就是相等的。NSObject自带的hash方法相当于hash表中的f(key)函数中的key,这“唯一”的key需要用户自己产生,至于用什么算法由用户自己决定,所以,只要我们规定一种不会产生重复hash码的方法即可。

比如


使用hash方法,所以我们的isEqual:方法就可以写成


对象等同性 ——[isEqual]方法的实现_第3张图片

大功告成。

你可能感兴趣的:(对象等同性 ——[isEqual]方法的实现)