对象等同性
“==”并非是判断对象等同性的正确途径,因为“==”比较的是指针是否相等,而不是对象。
NSObject提供一个方法和一个属性来判断等同性。
- (BOOL)isEqual: (id)object;
- (NSUInteger) hash;
举例说明上面的两个方法:
@interfaceAWYPerson :NSObject
@property(nonatomic,copy)NSString*name;
@property(nonatomic,copy)NSString*gender;
@property(nonatomic,assign)NSIntegerage;
@end
-(BOOL)isEqual:(id)object{
if(self== object)return YES;
if([self class] != [object class])return NO;
AWYPerson*person = (AWYPerson*)object;
if(![person.name isEqualToString:_name])return NO;
if(![person.gender isEqualToString:_gender])return NO;
if(person.age!=_age)return NO;
return YES;
}
//重写hash方法时,要尽量写那种性能好一点的算法,本文只是demo。
-(NSUInteger)hash{
return [_name hash] ^_age^ [_gender hash] ;
}
注意:容器中可变类型的等同性
例如在一个set中,存入两个可变数组,arrayA和arrayB。
首先,arrayA = [@[@1,@2] mutabelCopy];
[set addObject:arrayA];
//output:set = {(1,2)}
然后,arrayB = [@[@1] mutabelCopy];
[set addObject:arrayA];
//output:set = {(1),(1,2)}
[arrayB addObject:@2];
这时set的输出为://output:set = {(1,2),(1,2)}
竟然出现了相同的数组,这在语法中是不允许的。
总结要点:
1 若想要检测对象的等同性,需要提供isEqual:和hash方法。
2 相同的对象必须有相同的hash值,但是对象有相同的hash值,对象不一定相同。
网友评论