OC 判断两个对象是否相等

1.==

比较的是两个对象的指针本身,有时候返回的结果并不是我们想要的结果

2.isEqual

- (BOOL)isEqual:(id)object {
    if (self == object) {
        return YES;
    }
    if (![self class] == [object class]) {
        return NO;
    }
//此处还需判断对象中的各个属性是否相同
...
//若所有属性都相同则返回
    return YES;
}

首先判断两个指针是否相等,若相等,则均指向同一对象,所以受测的对象也必定相等。接下来判断两对象所属的类,若属于同一类

3.hash

比较得时候最好是先计算其哈希码,再进行比较。

4.isEqualToString

用于判断两个字符串是否相等的方法,当然还有isEqualToArray:   isEqualToDictionary: 

5.深度等同性判定

NSArray 的检测方式需要先比较两个数组所包含的个数是否相同,若相同,则在每个对应未知的两个对象身上调用其“isEqual:"方法。如果对应位置上的对象均相等,那么这两个数组就相等。

6.NSSet中可变类的等同性比较

以一个NSMutableSet与几个NSMtabelArray对象为列,首相把一个数组加入到set中:

    NSMutableSet *set = [NSMutableSet new];
    NSMutableArray *arrayA = [@[@1,@2] mutableCopy];
    [set addObject:arrayA];
    NSLog(@"set = %@", set);
    //Output: set = {[(1,2)]}

现在给set中继续加入一个相同数组:

    NSMutableArray *arrayB = [@[@1,@2] mutableCopy];
    [set addObjectsFromArray:arrayB];
    NSLog(@"set = %@", set);
    //Output: set = {[(1,2)]}

此时set里仍然只有一个对象:因为刚加入的那个数组对象和set里已有的数组对象相等,所以set并不会改变。我急继续给set里添加一个与已有对象不同的数组:

    NSMutableArray *arrayC = [@[@1] mutableCopy];
    [set addObjectsFromArray:arrayC];
    NSLog(@"set = %@", set);
    //Output: set = {[(1),(1,2)]}

此时由于ArrayC与set里已有的数组对象不相等,所以现在set离有两个数组了;现在我们改变ArrayC的内容:

    [arrayC addObject:@2];
    NSLog(@"set = %@", set);
    //Output: set = {[(1,2),(1,2)]}

set中居然可以包含两个彼此相等的数组!根据set的语义是不允许出现这种情况的,然而现在却无法保证这一点了,因为我们修改了set中已有的对象。若是拷贝次set,那就更糟糕了:

    NSSet *setB = [set copy];
    NSLog(@"setB = %@", setB);
    //Output: setB = {[(1,2)]}

复制过的set只剩一个对象了,次set看上去好像是由一个空set开始、逐个向其中添加新对象而创建出来的。

结论:如果把一个对象放入set之后又修改其内容,那么后面的行为将很难预料,使用过程中一定以注意,以免得到的不是自己想要的结果

注意:如果isEqual判断两个对象相等,那么hash方法也必须返回同一个值,但是,如果两个对象的hash方法返回同一个值,那么isEqual方法未必会认为两个方法相同

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值