32

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

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

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

4

3 回答 3

31

正如您猜对的那样,NSObject的默认isEqual:行为是比较对象的内存地址。奇怪的是,这目前没有记录在NSObject Class Reference中,但它记录在Introspection文档中,其中指出:

简单地检查指针是否相等的默认NSObject实现。isEqual:

当然,正如您无疑知道的那样, 的子类NSObject可以覆盖isEqual:以表现不同。例如,NSString'isEqual:方法,当传递另一个 时NSString,将首先检查地址,然后检查字符串之间的精确文字匹配。

于 2010-11-23T06:55:32.197 回答
12

The answer about default implementation of isEqual: is comprehensive one. So I just add my note about default implementation of hash. Here it is:

-(unsigned)hash {return (unsigned)self;}

I.e it's just the same pointer value which is used in isEqual:. Here's how you can check this out:

NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);

The result will be something like this:

obj: <NSObject: 0x16d44010>
hash: 16d44010

Best Regards.

BTW in iOS 8 hash became a property not a method, but it's there.

于 2014-10-01T02:43:03.543 回答
5

我会假设NSObject isEquals使用==运算符,并hash使用内存地址。

isEquals方法永远不应该hash用作相等性的绝对测试。hashCode如果您搜索足够多的对象(只需创建超过 2^32 个不同的对象,并且其中至少两个具有相同的对象),就可以保证有两个对象具有相似的hash

换句话说,hash需要以下规范:如果两个对象相等,则它们hash需要相等;但是,如果两个对象的hash值相等,则它们不一定相等。

作为提示,您始终应该覆盖isEqualshashCode一起。

于 2009-08-06T21:48:26.777 回答