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