您的位置:首页 > 移动开发 > Objective-C

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

2016-03-08 11:33 405 查看
大家都知道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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: