我正在尝试对2个可变数组进行数组比较。在其中一个数组中,我存储我的模型对象,而在另一个数组中,我使用[myObject copy]
存储模型对象的副本。我的模型对象是NSObject
的子类,所以我也添加了copyWithZone:
方法。但是当我在这两个数组上使用isEqualToArray
进行数组比较时,它总是返回false。比较不会对复制的对象起作用吗?或者我在其他地方出错了?
P.S :作为概述,我要做的是在调用更新服务之前检查我的模型中是否有更改。我想调用该服务仅在任何模型对象发生更改时。
答案 0 :(得分:2)
比较不会对复制的对象起作用吗?
通过复制单个对象并再次检查原始对象,您可以很容易地找到这个问题的答案。
您将看到的结果取决于您是否在班级中实施了自定义hash
和isEqual:
方法。如果没有这些,它将默认为超类实现(NSObject),它将相等性视为相同的指针。由于副本是指向同一对象的新指针,因此NSObject不会认为它们是相同的。
我建议您在this NSHipster article (great to start with)和/或this article by Mike Ash (if you are feeling curious)
中阅读有关对象平等的内容答案 1 :(得分:0)
方法 isEqualToArray 的行为如下。它将逐个接收来自两个数组的下一个对象,并使用 isEqual 进行比较。后者比较NSObjects(或其子类)的 hash (NSInteger属性)。 通常,它是对象的地址。 hash 可以在子类化时重新定义,但它可能会导致很大的问题。 对于复制的对象,您将具有不同的哈希值。因此isEqualToArray始终为FALSE。
但是如果您使用简单的数据类(如 NSNumber , NSString )作为要比较的元素,则在复制它们时将获得TRUE。