Effective Objective-C 总结(第二天)

对象等同性

“==”并非是判断对象等同性的正确途径,因为“==”比较的是指针是否相等,而不是对象。

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值,对象不一定相同。

你可能感兴趣的:(Effective Objective-C 总结(第二天))