美文网首页
理解“对象等同性”概念

理解“对象等同性”概念

作者: 奶茶007 | 来源:发表于2017-02-24 17:47 被阅读11次

    调用“isEqualToString”比调用“isEqual”方法快,后者还要执行额外步骤,因为它不知道受测对象的类型。
    NSObject协议中有两个用于判断等同性的关键方法:

    - (BOOL)isEqual:(id)object;
    - (NSUInteger)hash;
    

    默认实现:当且仅当其“指针值”完全相等时,这两个对象才相等。

    但是,如果我们所要求两个对象的所有字段相等,那么这两个对象就相等,那么实现方法可以写成:

    @interface      EOCPerson()
    @property (nonatomic,copy) NSString * firstName;
    @property (nonatomic,copy) NSString * lastName;
    @property (nonatomic,assign) NSUInteger age;
    
    @end
    @implementation EOCPerson
    - (BOOL)isEqual:(id)object{
        //判断两个指针是否相等,如果相等则指向同一对象,所以受测对象也必定相等
        if (self == object) {
            return YES;
        }
        //比较两个对象所属的类
        if ([self class] != [object class]) {
            return NO;
        }
        //如果是父类和子类可以这样写,子类和父类比
        if ([self isKindOfClass:[object class]]) {
            return NO;
        }
        //最后检测每个属性是否相等
        EOCPerson *otherPerson = (EOCPerson *)object;
        if (![_firstName isEqualToString:otherPerson.firstName]) {
            return NO;
        }
        if (![_lastName isEqualToString:otherPerson.lastName]) {
            return NO;
        }
        if (_age != otherPerson.age) {
            return NO;
        }
        return YES;
    
    }
    //这种做法既能保持较高效率,又能使生成的哈希码至少位于一定范围之内,而不会过于频繁重复。
    //编写hash方法,应该用当前的对象做实验,以便在减少碰撞频度与降低运算复杂程度之间的取舍。(其实我自己不是特别明白)
    - (NSUInteger)hash{
        NSUInteger firstName = [_firstName hash];
        NSUInteger lastName  = [_lastName hash];
        NSUInteger ageHash   = _age;
        //异或,不同为1,相同为0
        return firstName ^ lastName ^ ageHash;
    }
    

    相关文章

      网友评论

          本文标题:理解“对象等同性”概念

          本文链接:https://www.haomeiwen.com/subject/zbrwwttx.html