iOS 判断两个对象是否相等

释放双眼,带上耳机,听听看~!

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方法未必会认为两个方法相同

人已赞赏
iOS文章

iOS 自定义搜索框实时监听输入的内容变化

2020-3-29 16:33:03

iOS文章

iOS OC内存管理机制

2020-3-29 17:48:01

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索