面向全栈iOS学习在项目中踩过的坑

实现isEqual的良好实践

2017-06-21  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读