我有一个数据库模型类 NSObject. 。我有一组这些对象 NSMutableArray. 。我用 indexOfObject: 找到匹配的。问题是模型对象的内存地址发生变化。所以我要重写 hash 方法返回模型的行 ID。但这并不能解决问题。我还必须覆盖 isEqual: 方法来比较值 hash 方法。

什么是 isEqual: 默认情况下使用方法来确定相等性?

我假设它使用内存地址。读完后 isEqual: 文档我认为它使用了来自的值 hash 方法。显然,情况并非如此,因为我尝试覆盖该值并没有解决我最初的问题。

有帮助吗?

解决方案

正如你所猜对的那样, NSObject的默认值 isEqual: 行为是比较对象的内存地址。奇怪的是,目前这并没有记录在案 NSObject 类参考, ,但它记录在 内省 文档,其中指出:

默认 NSObject 实施 isEqual: 只是检查指针是否相等。

当然,正如您无疑知道的那样, NSObject 可以覆盖 isEqual: 表现不同。例如, NSStringisEqual: 方法,当传递另一个 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值是平等的,但它们不一定相等。

作为一个尖端,你总是应该重写isEqualshashCode在一起。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top