记录一下今天下午对这两个方法的学习。
基础类中的实现
在基类中的实现中,相等性检查本质上就是对本体性的检查,两个NSObject如果指向了同一个内存地址,那它们就被认为是相同的。
- (BOOL)isEqual:(id)object {
return self == object;
}
Person的父类是NSObject,创建Person类
- (NSUInteger)hash {
return [super hash];
}
Person *person = [[Person alloc] init];
NSLog(@"person = %ld", (NSUInteger)person);
NSLog(@"[person1 getSuperHash] = %ld", [person getSuperHash]);
打印结果如下:
person = 140643147498880
[person1 getSuperHash] = 140643147498880
可以看出 NSObject 的hash返回的就是该对象的内存地址。
自定义类中重写这两个方法的示例可以参考链接:
iOS开发 之 不要告诉我你真的懂isEqual与hash!
相等性判断
在 Foundation 框架中,下面这些 NSObject 的子类都有自己的相等性检查实现,分别使用下面这些方法:
NSAttributedString -isEqualToAttributedString:
NSData -isEqualToData:
NSDate -isEqualToDate:
NSDictionary -isEqualToDictionary:
NSHashTable -isEqualToHashTable:
NSIndexSet -isEqualToIndexSet:
NSNumber -isEqualToNumber:
NSOrderedSet -isEqualToOrderedSet:
NSSet -isEqualToSet:
NSString -isEqualToString:
NSTimeZone -isEqualToTimeZone:
NSValue -isEqualToValue:
对上面这些类来说,当需要对它们的两个实例进行比较时,推荐使用这些高层方法而不是直接使用 isEqual:。
hash的概念
hash table(也叫散列表)的设计就是为了加快查找速度。
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
详细介绍:
哈希表(散列表)原理详解
NSHipster建议重写hash的时候,使用
关键属性的散列值进行一个简单的 XOR操作,可以满足99%的需求了。
Equality