调用“isEqualToString”比调用“isEqual”方法快,后者还要执行额外步骤,因为它不知道受测对象的类型。
NSObject协议中有两个用于判断等同性的关键方法:
- (BOOL)isEqual:(id)object;
- (NSUInteger)hash;
默认实现:当且仅当其“指针值”完全相等时,这两个对象才相等。
但是,如果我们所要求两个对象的所有字段相等,那么这两个对象就相等,那么实现方法可以写成:
@interface EOCPerson()
@property (nonatomic,copy) NSString * firstName;
@property (nonatomic,copy) NSString * lastName;
@property (nonatomic,assign) NSUInteger age;
@end
@implementation EOCPerson
- (BOOL)isEqual:(id)object{
//判断两个指针是否相等,如果相等则指向同一对象,所以受测对象也必定相等
if (self == object) {
return YES;
}
//比较两个对象所属的类
if ([self class] != [object class]) {
return NO;
}
//如果是父类和子类可以这样写,子类和父类比
if ([self isKindOfClass:[object class]]) {
return NO;
}
//最后检测每个属性是否相等
EOCPerson *otherPerson = (EOCPerson *)object;
if (![_firstName isEqualToString:otherPerson.firstName]) {
return NO;
}
if (![_lastName isEqualToString:otherPerson.lastName]) {
return NO;
}
if (_age != otherPerson.age) {
return NO;
}
return YES;
}
//这种做法既能保持较高效率,又能使生成的哈希码至少位于一定范围之内,而不会过于频繁重复。
//编写hash方法,应该用当前的对象做实验,以便在减少碰撞频度与降低运算复杂程度之间的取舍。(其实我自己不是特别明白)
- (NSUInteger)hash{
NSUInteger firstName = [_firstName hash];
NSUInteger lastName = [_lastName hash];
NSUInteger ageHash = _age;
//异或,不同为1,相同为0
return firstName ^ lastName ^ ageHash;
}