ios开发之判断对象的等同性isEqual

     在开发中我们经常会遇到这样的情况:判断两个元素或者对象是否相等。经常用到的有“==”或者isEqual或者isEqualToString等等。下边我们就来介绍一下这几种方法的区别。


一、 “ == ”

    “==”操作符判断的是两个指针本身(也就是两个对象的内存地址),而不是所指的对象。

    NSString *str1 = @"bound 123";
    NSString *str2 = [NSString stringWithFormat:@"bound %@",@"123"];
    
    NSLog(@"%@,%p",str1,&(str1));
    NSLog(@"%@,%p",str2,&(str2));
    
    if (str1 == str2) {
        NSLog(@"== YES");
    } else {
        NSLog(@"== NO");
    }

控制台输出结果:
2015-03-12 16:30:15.699 IsEqual[1711:607] bound 123,0xbfffc80c
2015-03-12 16:30:15.699 IsEqual[1711:607] bound 123,0xbfffc808
2015-03-12 16:30:15.700 IsEqual[1711:607] == NO

从上边可以看出来,str1和str2打印出来的结构都是bound 123,但是if判断输出NO,从内存地址看,发现两者内存地址不同,由此可以看出“ == ”判断比较的是两个“指针”本身,而不是对象。


二、“- (BOOL)isEqual:(id)object; ” “+ (NSUInteger)hash;”

       NSObject协议中声明了判断对象等同性的两个方法,这两个方法返回相等条件是:当且仅当“指针值”完全相等的时候,对象才相等。如果isEqual判断两个对象相等,那么两个对象的hash返回值也一定相等。反之hsah值相等,isEqual未必认为两者一样。


今天在写的时候突然被指针和指针值绕蒙了,下午回来研究研究再接着写

你可能感兴趣的:(ios开发)