什么是 NSObject isEqual:和哈希默认函数?
-
12-09-2019 - |
题
我有一个数据库模型类 NSObject
. 。我有一组这些对象 NSMutableArray
. 。我用 indexOfObject:
找到匹配的。问题是模型对象的内存地址发生变化。所以我要重写 hash
方法返回模型的行 ID。但这并不能解决问题。我还必须覆盖 isEqual:
方法来比较值 hash
方法。
什么是 isEqual:
默认情况下使用方法来确定相等性?
我假设它使用内存地址。读完后 isEqual:
文档我认为它使用了来自的值 hash
方法。显然,情况并非如此,因为我尝试覆盖该值并没有解决我最初的问题。
解决方案
正如你所猜对的那样, NSObject
的默认值 isEqual:
行为是比较对象的内存地址。奇怪的是,目前这并没有记录在案 NSObject 类参考, ,但它记录在 内省 文档,其中指出:
默认
NSObject
实施isEqual:
只是检查指针是否相等。
当然,正如您无疑知道的那样, NSObject
可以覆盖 isEqual:
表现不同。例如, NSString
的 isEqual:
方法,当传递另一个 NSString
, ,将首先检查地址,然后检查字符串之间的精确文字匹配。
其他提示
有关isEqual:
的默认实现答案是综合性的。于是我就加入约hash
的默认实现我的笔记。在这里它是:
-(unsigned)hash {return (unsigned)self;}
即它只是其在isEqual:
使用相同的指针值。这里是你如何检查了这一点:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);
其结果将是这样的:
obj: <NSObject: 0x16d44010>
hash: 16d44010
最好的问候。
顺便说一句在IOS 8 hash
成了属性不是方法,但它的存在。
我假设NSObject
isEquals
使用==
操作者,和hash
使用存储器地址。
isEquals
方法应该从不使用hash
作为平等绝对测试。它保证具有具有类似hashCode
两个对象,如果搜索足够的对象(刚刚创建多于2 ^ 32个不同的对象,以及它们中至少两种的将具有相同的hash
)。
在换句话说,hash
需要以下规格:如果两个对象是平等的,那么它们的hash
需要等于;然而,如果两个对象的hash
值是平等的,但它们不一定相等。
作为一个尖端,你总是应该重写isEquals
和hashCode
在一起。