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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值