==
对于基本类型, ==运算符比较的是值;
对于对象类型, ==运算符比较的是对象的地址(即是否为同一对象)
isEqual
UIColor *color1 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
UIColor *color2 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
NSLog(@"color1 == color2 = %@", color1 == color2 ? @"YES" : @"NO");
NSLog(@"[color1 isEqual:color2] = %@", [color1 isEqual:color2] ? @"YES" : @"NO");
color1 == color2 = NO
[color1 isEqual:color2] = YES
对于OC系统对象 内部已经做了处理 会判断他们相等
但是 我们的自定义对象如果不重写 isEqual 返回的是NO 所以如果要判断 我们自己的对象是否相等 就需要我们自己 来重写isEqual方法
重写isEqual
@interface Person : NSObject<NSCopying>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *age;
@property (nonatomic, strong) NSDate *date;
@end
- (BOOL)isEqual:(id)object {
if (self == object) {
return YES;
}
if (![object isKindOfClass:[Person class]]) {
return NO;
}
return [self isEqualToPerson:(Person *)object];
}
- (BOOL)isEqualToPerson:(Person *)person {
if (!person) {
return NO;
}
BOOL haveEqualNames = (!self.name && !person.name) || [self.name isEqualToString:person.name];
BOOL haveEqualBirthdays = (!self.age && !person.age) || [self.age isEqualToString:person.age];
return haveEqualNames && haveEqualBirthdays;
}
为什么需要重写对象的hash值
hash方法只在对象被添加至NSSet和设置为NSDictionary的key时会调用
也就是当我们的对象作为key的时候我们就需要重写hash值了
Person *person1 = [Person personWithName:@"Joe" age:@"32"];
Person * = [Person personWithName:@"Joe" age:@"32"];
Person *person3 = [Person personWithName:@"Joe" age:@"33"];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"1" forKey:person1];
[dict setObject:@"2" forKey:person2];
[dict setObject:@"3" forKey:person3];
NSLog(@"person1----%@", [dict objectForKey:person1]);
NSLog(@"person2----%@", [dict objectForKey:person2]);
NSLog(@"person3----%@", [dict objectForKey:person3]);
NSLog(@"dict count: %ld", dict.count);
这时候输出的是 3。但是我们重写了isEqual方法 person1 person2 是同一个对象 应该输出的是2。 所以我们需要重写 hash 方法
- (NSUInteger)hash {
return [self.name hash] ^ [self.birthday hash];
}
参考
网友评论