实现isEqual的良好实践

作者: 子达如何 | 来源:发表于2017-06-21 17:30 被阅读52次
    1. 重写 -isEqual: 必须重写 -hash,因为实现哈希需要这个方法配合--遥想当年定义了一个Model的属性叫hash的不眠之夜😓。
    2. 总是先比较指针。 这样可以节约自己与自己比较的开销。
    3. 在比较对象的值(-isEqual:)之前,总是检查一下是不是nil。用 left == right || [left isEqual:right] 这样的判断语句可以避免出现[nil isEqual:nil]得到NO的情况。
    4. 总是优先比较最容易得到结果的值。比如,[self.array isEqual:other.array] && self.intVal == other.intVal 在intVal不相同的情况下,这样的比较就很浪费性能了。

    举个栗子(🌰😆), 假设一个User的模型有这样的接口定义:

    @interface User : NSObject
    
    @property NSInteger identifier;
    @property NSString *name;
    @property NSArray *posts;
    
    @end
    

    那么,实现相等的方法看起来应该是这样的:

    @implementation User
    
    - (NSUInteger)hash {
      return self.identifier;
    }
    
    - (BOOL)isEqual:(id)object {
      if (self == object) { 
          return YES;
      }
    
      if (![object isKindOfClass:[User class]]) {
          return NO;
      }
    
      User *right = object;
      return self.identifier == right.identifier 
          && (self.name == right.name || [self.name isEqual:right.name])
          && (self.posts == right.posts || [self.posts isEqualToArray:right.posts]);
    }
    
    @end
    

    相关文章

      网友评论

        本文标题:实现isEqual的良好实践

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