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方法,我们可以根据对象的属性值来判断对象的相等性,并生成唯一的哈希值。这样在进行对象的比较和存储时,就能得到正确的结果。