Objective-C中关于isEqual与“==”的区别解析

大家都知道equal和==有区别,但是很难去讲出来,这里我通过简单的例子讲一下,如有错误,请大婶们指教,感谢!

//    ==============================
//    这样str1和str2存放在常量区中,指向的是同一个地址
    NSString * str1 = @"123";
    NSString * str2 = @"123";
    NSLog(@"%p,%p,equal:%d,==:%d",str1,str2,[str1 isEqual:str2],str1 == str2);
//    0x107eb7068,0x107eb7068,equal:1,==:1
    
    
//    ==============================
//    str3指向常量区,str4指向的是变量字符串区域,指向的是不同地址
    NSString * str3 = @"123";
    NSString * str4 = [NSString stringWithFormat:@"123"];
    NSLog(@"%p,%p,equal:%d,==:%d",str3,str4,[str3 isEqual:str4],str3 == str4);
    NSLog(@"StringEqual:%d",[str3 isEqualToString:str4]);
//    0x107eb7068,0xa000000003332313,equal:1,==:0
//    StringEqual:1
    
    
//    ==============================
//    字符串的内存空间分配与其他Object对象的分配方式有所不同,相同内容的字符串的哈希值相同,所以即使用了alloc来开辟内存,结果指向的内存还是同一块内存,并且都存放在变量区,两个对象的isEqual结果是true。
    NSString * str5 = [[NSString alloc]initWithFormat:@"123"];
    NSString * str6 = [[NSString alloc]initWithFormat:@"123"];
    NSLog(@"%p,%p,equal:%d,==:%d",str5,str6,[str5 isEqual:str6],str5 == str6);
    NSLog(@"StringEqual:%d",[str5 isEqualToString:str6]);
//    0xa000000003332313,0xa000000343332314,equal:0,==:0
//    StringEqual:1
    
    
//    ==============================
//    对于一般的Object对象来说,alloc开辟出来的空间是不同的,在没有复写isEqual方法的前提下,两个对象的hash值和内存地址都是不同的,所以isEqual会返回false。(注意,复写了isEqual方法的话另说!)
    CJHObject * obj1 = [[CJHObject alloc]init];
    CJHObject * obj2 = [[CJHObject alloc]init];
    NSLog(@"%p,%p,equal:%d,==:%d",obj1,obj2,[obj1 isEqual:obj2],obj1 == obj2);
//    0x7fae03f25d90,0x7fae03f0a1a0,equal:0,==:0


你可能感兴趣的:(iOS)