NSObject isEqual 和 hash 默认函数是什么

作者:编程家 分类: objective 时间:2025-07-08

NSObject是Objective-C中的一个基类,其他所有类都是它的子类。在NSObject类中,有两个默认的函数——isEqual:和hash,用于比较对象的相等性和生成对象的哈希值。

isEqual:函数用于判断两个对象是否相等。默认情况下,NSObject类的isEqual:方法会比较两个对象的指针地址是否相同,即判断它们是否是同一个对象。如果想要自定义isEqual:方法,需要在子类中重写这个方法,并根据自己的需求来判断对象的相等性。通常情况下,我们会比较对象的属性值来确定它们是否相等。

hash函数用于生成对象的哈希值。哈希值是一个整数,用来表示对象的唯一性。默认情况下,NSObject类的hash方法会返回对象的指针地址的哈希值。如果想要自定义hash方法,需要在子类中重写这个方法,并根据对象的属性值计算出一个唯一的哈希值。通常情况下,我们会使用对象的某些属性值来计算哈希值,以保证相等的对象具有相同的哈希值。

自定义isEqual:方法和hash方法的案例代码如下:

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;

@property (nonatomic, assign) NSInteger age;

@end

@implementation Person

- (BOOL)isEqual:(id)object {

if (self == object) {

return YES;

}

if (![object isKindOfClass:[Person class]]) {

return NO;

}

Person *otherPerson = (Person *)object;

return [self.name isEqualToString:otherPerson.name] && self.age == otherPerson.age;

}

- (NSUInteger)hash {

NSUInteger prime = 31;

NSUInteger result = 1;

result = prime * result + [self.name hash];

result = prime * result + self.age;

return result;

}

@end

在上述代码中,我们定义了一个Person类,包含了name和age两个属性。我们重写了isEqual:方法,通过比较两个Person对象的name和age属性值来判断它们是否相等。同时,我们还重写了hash方法,使用name和age属性值来计算哈希值。

自定义isEqual:和hash方法的重要性

自定义isEqual:和hash方法对于对象的比较和存储是非常重要的。如果我们不重写这两个方法,那么默认情况下会使用NSObject类的实现,即比较对象的指针地址和生成指针地址的哈希值。这可能并不符合我们的实际需求,因为两个对象的属性值相同,但指针地址不同,那么默认的isEqual:方法会返回NO,而我们期望它们是相等的。

如何正确地重写isEqual:和hash方法

在重写isEqual:方法时,需要遵循以下几个原则:

1. 先比较对象的指针地址,如果相同则返回YES,表示它们是同一个对象。

2. 判断传入的object是否为当前类的实例,如果不是则返回NO。

3. 将传入的object转换为当前类的实例,并比较对象的属性值,判断它们是否相等。

在重写hash方法时,需要遵循以下原则:

1. 定义一个素数,用于计算哈希值。

2. 将每个属性的哈希值与素数相乘,并累加到结果中。

3. 返回最终的结果作为对象的哈希值。

通过自定义isEqual:和hash方法,我们可以根据对象的属性值来判断对象的相等性,并生成唯一的哈希值。这样在进行对象的比较和存储时,就能得到正确的结果。