美文网首页
iOS日记1-如何判断对象等同?

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

作者: Mcyboy007 | 来源:发表于2017-02-07 10:52 被阅读0次

    如何判断对象等同?

    在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-如何判断对象等同?

          本文链接:https://www.haomeiwen.com/subject/aonuittx.html