hash与isEqual对象过滤

2018-06-26  本文已影响15人  lltree

参考:isEqual & hash
参考:iOS开发 之 不要告诉我你真的懂isEqual与hash!

如何判断对象是否相等

对于基本类型, ==运算符比较的是值; 对于对象类型, ==运算符比较的是对象的地址(即是否为同一对象)

如下例子:

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

而对于对象判断是否相等需要使用** isEqual**方法,该方法不自定义重写则判断是否地址相同,如果自定义重写则判断自定义的条件是否相等;

hash与isEqual对象过滤

请阅读参考:isEqual & hash

@implementation Person


- (instancetype)initWithName:(NSString *)name age:(int)age
{
    self = [super init];
    if (self) {
        
        _name = name;
        _age = age;
    }
    return self;
}

-(BOOL)isEqual:(Person *)object{
    
    NSLog(@"I'm here:isEqual");
    
    if (!object) {
        return NO;
    }
    if ([self.name isEqual:object.name] && (self.age == object.age)) {
        
        return YES;
    }
    return NO;
}

- (NSUInteger)hash{
    NSUInteger hash = [super hash];
    NSLog(@"I'm here:hash%ld",hash);
    return hash;
}
@end

测试代码:

        Person *person1  = [[Person alloc] initWithName:@"张三" age:10];
        Person *person2  = [[Person alloc] initWithName:@"李四" age:10];
        Person *person3  = [[Person alloc] initWithName:@"李四" age:10];

        NSMutableSet *mSet = [NSMutableSet set];
        [mSet addObject:person1];
        [mSet addObject:person2];
        [mSet addObject:person3];
        NSLog(@"mSet.count:%ld",mSet.count);

每次mSet 执行addObject时都会优先获取hash值,

上一篇 下一篇

猜你喜欢

热点阅读