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

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

不如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:方法就可以写成


大功告成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容