iOS日记1-如何判断对象等同?

如何判断对象等同?

在NSObject协议中有2个方法用于判断等同性,我么分别去了解它们是如何实现的:

  1. - (BOOL)isEqual:(id)object;
  2. - (NSUInteger)hash;

isEqual

我们平时最常用的是第一种,代码如下:

NSString *foo = @"Mcyboy 123";
NSString *bar = [NSString stringWithFormat:@"Mcyboy 123"];
BOOL equalA = (foo == bar);  //NO
BOOL equalB = [foo isEqual:bar];  //YES
BOOL equalC = [foo isEqualToString:bar];  //YES

解释:
==:比较两个指针的内存地址,而不是指针所指的对象。
isEqualToString:判断2个字符串是否相等,速度比isEqual方法块。
isEqual:通用方法,判断两个对象是否相等。因为没有参数对象的类型,需要执行额外的步骤。

2)如果碰到非OC基本数据类型需要比较等同性,我们该如何去做?通常的做法是,如果比较的两个对象属于同一个类,则调用该类的判定方法;否则,交由超类比较。
怎么理解?看如下代码:

//@property NSString *name;
//@property NSDate *birthday;

- (BOOL)isEqualToPerson:(Person *)person {
  if (self == person) return YES;
  if (![_name isEqualToString:person.name]) {
    return NO;
  }
  if (![_birthday isEqualToDate:person.birthday]) {
    return NO;
  }
  return YES;
}

- (BOOL)isEqual:(id)object {
  if ([self class] == [object class]) {
    return [self isEqualToPerson:(Person *)object];
  } else {
    return [super isEqual:object];
  }
}

- (NSUInteger)hash {
  return [self.name hash] ^ [self.birthday hash];
}

解析:

  • 1.判断2个person对象是否相等时,我们调用isEqual:方法。如果是同类型,则调用isEqualToPerson方法,如果不是,丢给超类判断。
    1. namebirthday都有各自的类型,分别为NSStringNSDate,直接调用系统的判定方法即可。

hash

两个对象相等,他们的hash值必定相等;但是hash值相等,两个对象不一定相等。
hash的实现方法就不多介绍了。

你可能感兴趣的:(iOS日记1-如何判断对象等同?)