实现isEqual的良好实践

  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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容