Bre*_*den 28 objective-c nsarray nsobject
我有一个数据库模型类NSObject.我有一组这些对象NSMutableArray.我用indexOfObject:来找比赛.问题是模型对象的内存地址更改.所以我重写了hash返回模型行ID的方法.然而,这并没有解决它.我还必须覆盖isEqual:方法来比较方法的值hash.
isEqual:默认情况下,该方法用于确定相等性的是什么?
我假设它使用内存地址.阅读isEqual:文档后,我认为它使用了hash方法中的值.显然,事实并非如此,因为我试图覆盖这个价值并没有解决我最初的问题.
Ken*_*ker 28
正如您所猜测的那样,NSObject默认isEqual:行为是比较对象的内存地址.奇怪的是,目前还没有在NSObject类参考中记录,但它在Introspection文档中有记录,该文档指出:
默认
NSObject实现isEqual:只是检查指针相等性.
当然,正如您无疑意识到的那样,子类NSObject可以覆盖isEqual:以表现不同.例如,NSString的isEqual:方法中,当通过另一种NSString,将首先检查该地址,然后检查该串之间的精确匹配的文字.
关于默认实现的答案isEqual:是全面的.所以我只是添加关于默认实现的注释hash.这里是:
-(unsigned)hash {return (unsigned)self;}
Run Code Online (Sandbox Code Playgroud)
也就是说,它只是用于的指针值isEqual:.这是你如何检查这个:
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj: %@",obj);
NSLog(@"hash: %x",obj.hash);
Run Code Online (Sandbox Code Playgroud)
结果将是这样的:
obj: <NSObject: 0x16d44010>
hash: 16d44010
Run Code Online (Sandbox Code Playgroud)
最好的祝福.
iOS 8中的BTW hash成为属性而非方法,但它就在那里.
我假设NSObject isEquals使用==运算符,并hash使用内存地址。
isEquals方法永远不应该hash用作相等性的绝对测试。hashCode如果您搜索足够多的对象(只需创建超过 2^32 个不同的对象,并且其中至少两个将具有相同的hash),则保证有两个具有相似 的对象。
换句话说,hash需要以下规范:如果两个对象相等,则它们hash需要相等;但是,如果两个对象的hash值相等,则它们不一定相等。
作为提示,您应该始终覆盖isEquals和hashCode一起。
| 归档时间: |
|
| 查看次数: |
11411 次 |
| 最近记录: |