Skip to content

实现 isEqual 和 hash 方法时要注意什么 #168

@tbfungeek

Description

@tbfungeek

在 iOS 中,判断两个对象内容是否相等,一般调用 isEqual 方法。用 == 来判断两个对象是否相等,其实是判断两个对象的地址是否相等。isEqual 系统默认实现是比较两个对象的指针。所以在项目中如果需要指定一套自己判断两个对象是否相同的标准的时候就需要重写isEqual,

hash 方法的存在,是因为将对象加到 NSSet 等集合中时,需要利用对象的 Hash 值来标示对象在集合中的位置,将集合查找元素的时间复杂度优化成 O(1)。对于 Hash 值,系统默认是返回该对象的内存地址。下面是一般isEqual和hash的写法模版。

- (BOOL)isEqual:(id)object {
    //1. == 判断地址
    if (self == object) return YES;
    //2.isKindOfClass 判断对象类型
    if (![object isKindOfClass:[self class]]) return NO;
    //3. 进行业务逻辑判断
    return [self isEqualToFather:(Father *)object];
}

- (BOOL)isEqualToFather:(Father *)object {
    //业务逻辑
    if ([self.name isEqualToString:object.name]) {
        return YES;
    }else {
        return NO;
    }
}
- (NSUInteger)hash {
    return [self.name hash] ^ [self.birthday hash];
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions