美文网首页iOS Developer
对象等同性-isEqual: 和- hash

对象等同性-isEqual: 和- hash

作者: 2d899c5242bd | 来源:发表于2017-08-27 19:31 被阅读45次

根据等同性来比较对象是一个非常有用的功能。不过,按照==操作符得到的结果未必使我们想要的。该操作比较的是两个指针本身,而不是指针所指向的对象(oc里所说的对象实际上都是指向该对象的指针)。

怎么判断两个对象是否相等?在NSObject协议中定义的两个方法和属性与对象等同性相关

@protocol NSObject

- (BOOL)isEqual:(id)object;
@property (readonly) NSUInteger hash;//哈希码
 
...

@end

这两个方法和属性满足一个约定
如果‘isEqual:’方法判定两个对象相等,那么其hash方法也必须返回同一个值。但是,如果两个对象的hash方法返回同一个值,那么'isEqual:'方法未必会认为两者相等
NSObject 类已经为我们提供了默认实现

- (NSUInteger)hash {//哈希码
    return _objc_rootHash(self);
}
- (BOOL)isEqual:(id)obj {
    return obj == self;
}

说白了,该实现就是在判断两个对象指针是否相同。


两方法与集合类的关系

  • NSSet: set会把对象按哈希码存放成不同的组。在向里添加对象的时候会先查看哈希码,然后查看该哈希码对应的一组对象与要加入的对象是否相同(即调用isEqual:)
  • NSArray: 该对象的containsObject:,实际是通过已有对象调用isEqual : 和新加入的对象比较,如果为true,则包含该对象
    *NSDictionary<key,value>:isEqualToDictionary:,也会用到value对象的isEqual :,需要key对应的value对象等同。

如果在应用里如果该实现不满足需求,就要覆写实现这两个方法。
覆写的时候需要注意:

  • 该hash方法是和NSSet 类相关联的- (NSUInteger)hash { return 1347; }这种写法,会让NSSet的效率变低。(set的实现可能是根据哈希码把对象分到不同的数组中,而每个数组中的对象不能相同)

测试用例

- (void)testStringAddToSet {
    NSString *str1 = @"placement1";
    NSMutableString *str2 = [[NSMutableString alloc] initWithString:@"placement1"];
    NSLog(@"------  %d", str1 == str2);
    NSSet *set = [NSSet setWithObjects:str1,str2, nil];
    XCTAssertTrue(set.count == 1);
}

输出

------  0
Test Case '-[XXXTests testStringAddToSet]' passed (0.002 seconds).

相关文章

  • (八) [OC高效系列]理解对象等同性

    1.对象等同性约定 2.isEqual的正确书写方式 以如下类为例: isEqual的正确书写方式 3.hash值...

  • 对象等同性-isEqual: 和- hash

    根据等同性来比较对象是一个非常有用的功能。不过,按照==操作符得到的结果未必使我们想要的。该操作比较的是两个指针本...

  • 对象等同性之isEqual和hash

    问题引入 用集合过滤重复元素 如果自定义对象Person呢? 自定义对象Person,加入集合,从指针方面看,指向...

  • iOS 对象判断相等

    == isEqual 重写isEqual 为什么需要重写对象的hash值 参考

  • hash与isEqual对象过滤

    参考:isEqual & hash参考:iOS开发 之 不要告诉我你真的懂isEqual与hash! 如何判断对象...

  • iOS中isEqual和Hash的笔记(一)

    iOS中isEqual和Hash的笔记(一) iOS中isEqual和Hash的笔记(一)

  • iOS补充知识

    1、Hash方法与isEqual 1.1、== 运算符判断对象内存地址是否相同 1.2、isequal判断对象是否...

  • 相等性

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • 对象相等性isEqual

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • [16]Effective Objective-C 2.0【8-

    第八条:理解“对象等同性”这一概念 isEqualToString 比isEqual 快,因为后者还要之行额外的步...

网友评论

    本文标题:对象等同性-isEqual: 和- hash

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