复制对象的可变数组比较

时间:2014-01-14 08:41:43

标签: ios iphone objective-c arrays nsmutablearray

我正在尝试对2个可变数组进行数组比较。在其中一个数组中,我存储我的模型对象,而在另一个数组中,我使用[myObject copy]存储模型对象的副本。我的模型对象是NSObject的子类,所以我也添加了copyWithZone:方法。但是当我在这两个数组上使用isEqualToArray进行数组比较时,它总是返回false。比较不会对复制的对象起作用吗?或者我在其他地方出错了?

P.S :作为概述,我要做的是在调用更新服务之前检查我的模型中是否有更改。我想调用该服务仅在任何模型对象发生更改时。

2 个答案:

答案 0 :(得分:2)

  

比较不会对复制的对象起作用吗?

通过复制单个对象并再次检查原始对象,您可以很容易地找到这个问题的答案。

SPOILER

您将看到的结果取决于您是否在班级中实施了自定义hashisEqual:方法。如果没有这些,它将默认为超类实现(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。