【发布时间】:2010-11-17 12:20:40
【问题描述】:
我有一个NSObject 的数据库模型类。我在NSMutableArray 中有一组这些对象。我使用indexOfObject: 来查找匹配项。问题是模型对象的内存地址发生了变化。所以我重写了hash 方法来返回模型的行ID。然而,这并不能解决它。我还必须重写isEqual: 方法来比较hash 方法的值。
isEqual: 方法默认使用什么来确定相等性?
我假设它使用内存地址。阅读isEqual: 文档后,我认为它使用了hash 方法中的值。显然,情况并非如此,因为我尝试覆盖该值并没有解决我最初的问题。
【问题讨论】:
-
这里有一些推测性的答案。任何人都可以提供默认 isEquals 使用地址的实际文档吗?我并不是建议它不使用,只是想从马的嘴里听到它。
-
@DougW 我分享了你对此的感受,所以我找到了一份官方参考资料并将其编辑为接受的答案。
-
您正在阅读 NSObject 协议的文档,而不是 NSObject 类。协议定义了方法应该做什么,类没有定义它实际做什么。覆盖 equals 和 hash 以按照您希望的方式工作总是最安全的。
-
@TerryWilcox 不,它已记录在案,正如接受的答案中所引用的那样。它只是没有记录在您期望的类参考中。绝对没有必要重写
isEqual:来执行与==的显式指针比较,只是为了安全地传递indexOfObject:某个任意NSObject子类的实例——你可以相信NSObject的isEqual:会做指针比较。 -
@TerryWilcox 我同意关于这一点的文档非常糟糕,但我认为建议您始终覆盖
isEqual:而不要相信NSObject的实现太过分了。显然,如果指针相等(这是NSObject的isEqual:实现检查的内容)实际上不是您想要的,那么您应该覆盖它。
标签: objective-c nsarray nsobject