=、isEqual和isEqualToString

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

你可能感兴趣的:(=、isEqual和isEqualToString)