iOS Developer

对象等同性-isEqual: 和- hash

2017-08-27  本文已影响45人  2d899c5242bd

根据等同性来比较对象是一个非常有用的功能。不过,按照==操作符得到的结果未必使我们想要的。该操作比较的是两个指针本身,而不是指针所指向的对象(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;
}

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


两方法与集合类的关系

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

测试用例

- (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).
上一篇 下一篇

猜你喜欢

热点阅读