- 重写
-isEqual:
必须重写-hash
,因为实现哈希需要这个方法配合--遥想当年定义了一个Model的属性叫hash的不眠之夜😓。 - 总是先比较指针。 这样可以节约自己与自己比较的开销。
- 在比较对象的值(
-isEqual:
)之前,总是检查一下是不是nil。用left == right || [left isEqual:right]
这样的判断语句可以避免出现[nil isEqual:nil]
得到NO的情况。 - 总是优先比较最容易得到结果的值。比如,
[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