1.比较两个变量,结果却有不同:
NSString *string1 = @"123";
NSString *string2 = @"123";
// 比较两个字符串的内存地址,而且地址是指向变量的地址
NSLog(@"----%zd",string1 == string2);
// 比较两个字符串的内容
NSLog(@"----%zd",[string1 isEqualToString:string2]);
// 默认比较两个字符串的内存地址,但是如果比较的两个对象是foundation框架中的对象,则系统重写了isEqual方法,比较内容
NSLog(@"----%zd",[string1 isEqual:string2]);
Person *person1 = [[Person alloc]init];
person1.name = @"123";
person1.age = 15;
Person *person2 = [[Person alloc]init];
person2.name = @"123";
person2.age = 15;
NSLog(@"++++%zd",[person1 isEqual:person2]);
对于==这种形式,我们易于理解,但为什么isEqualToString和isEqual会有不同呢?原因在于苹果在底层做了优化,isEqualToString实质上是重写了isEqual方法,例如以下所示:
Person *person1 = [[Person alloc]init];
person1.name = @"123";
person1.age = 15;
Person *person2 = [[Person alloc]init];
person2.name = @"123";
person2.age = 15;
NSLog(@"++++%zd",[person1 isEqual:person2]);
返回的结果就是NO,因为我们自定义了Person这个类并没有重写isEqual这个方法,两个对象比较的默认还是内存地址。
2.那问题又来了,如果我们想要比较Person的两个对象内容看是否形同,那如何办到呢?示例代码如下:
#import "XMGPerson.h"
#import "XMGCar.h"
/*
一旦重写了isEqual:方法,最好重写hash方法,而且要遵守以下原则:
1.isEqual:返回YES的2个对象,hash值一定要一样
2.hash值一样的2个对象,isEqual:返回不一定是YES
*/
@implementation XMGPerson
- (NSUInteger)hash
{
return self.age + self.no + self.name.hash + self.car.hash;
}
- (BOOL)isEqual:(XMGPerson *)object
{
return [self isEqualToPerson:object];
}
- (BOOL)isEqualToPerson:(XMGPerson *)person
{
// 如果是完全相同的对象,就省去后面的判断
if (self == person) return YES;
// 如果object的类型不对,就不需要比较
if (![person isKindOfClass:self.class]) return NO;
// 基本数据类型
BOOL result = (self.age == person.age && self.no == person.no);
if (result == NO) return result;
// 对象类型
if (self.name || person.name) {
if (![self.name isEqual:person.name]) return NO;
}
if (self.car || person.car) {
if (![self.car isEqual:person.car]) return NO;
}
return YES;
}
@end