实现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的良好实践

    重写 -isEqual: 必须重写 -hash,因为实现哈希需要这个方法配合--遥想当年定义了一个Model的属性...

  • 相等性

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • 对象相等性isEqual

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • iOS 从源码来探讨 isEqual 和 hash

    iOS 从源码来探讨 isEqual 和 hash 系统 isEqual 实现原理 先看一段代码 打印001,可以...

  • NSobject常用api

    核心是类模型1 isEqual内部实现比较指针是否相等if (self == other) return YES;...

  • iOS 对象判断相等

    == isEqual 重写isEqual 为什么需要重写对象的hash值 参考

  • 良好实践

    过滤输入: 是指转义或者删除不安全的字符。在数据到达应用的储存层(mysql or redis)之前,一定要过滤输...

  • isEqual 与 ==

    isEqual 是NSObject提供的一个方法func isEqual(_ object: Any?) -> B...

  • iOS中isEqual和Hash的笔记(一)

    iOS中isEqual和Hash的笔记(一) iOS中isEqual和Hash的笔记(一)

  • Effective-Objc 52 tips

    1.判断对象是否相等的tip isEqual or == isEqual方法来自于NSObject协议,有时等号不...

网友评论

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

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