Objective C中两个对象的相等性

时间:2014-03-30 10:43:08

标签: ios objective-c

我正在阅读Programming with Objective-C。在确定对象的平等一节中,它说了以下几个字:

- 处理对象时,==运算符用于测试两个单独的指针是否指向同一个对象:

if (firstPerson == secondPerson) {
    // firstPerson is the same object as secondPerson
}

- 如果你需要测试两个对象是否代表相同的数据,你需要调用一个像isEqual:这样的方法,可以从NSObject中获取:

if ([firstPerson isEqual:secondPerson]) {
    // firstPerson is identical to secondPerson
}

我对==isEqual与上述解释之间的差异感到困惑,这是否意味着firstPerson == secondPerson[firstPerson isEqual:secondPerson]的替代?

3 个答案:

答案 0 :(得分:2)

NSString *string1 = [[NSString alloc] initWithString:@"some string"];
NSString *string2 = [[NSString alloc] initWithString:@"some string"];
NSString *string3 = string2;

BOOL equal1 = (string1 == string2); // NO

BOOL equal2 = [string1 isEqual:string2]; // YES

BOOL equal3 = (string2 == string3); // YES

BOOL equal4 = [string2 isEqualToString:string3]; // YES

答案 1 :(得分:1)

==的定义是正确的,它检查它们是否指向实际相同的指针/内存地址(即0xffffff

理解你所要问的关键是要用“平等”这个词来思考你的意思。从开发人员的角度来看,“相等”通常意味着“这两个对象在我为所有实际目的所需的字段中包含相同的数据”。您可以拥有两个user个对象,每个对象具有相同的userID属性但在lastUpdated中的时间不同 - 您认为它们是否相等?取决于您的用例。很可能你会说是,因为他们是同一个用户。它们在不同时间从服务器更新,因此某些字段有所不同,但对于您的实现,它们是相同的。

在上面的例子中,它们是同一个对象吗?当然不。它们指向不同的内存地址。因此,==将为NO,而如果您编写isEqual:方法仅检查userID属性,则会返回YES

isEqual:的定义完全取决于班级的作者。如果您愿意,可以编写isEqual:以使用==。在您的课程中,您所要做的就是覆盖isEqual:协议定义的NSObject方法。

如果您有自定义对象,请使用isEqual:来定义您的相等定义。在用户对象的示例中,您可以定义:

- (BOOL)isEqual:(id)otherObject {
    if ([otherObject isKindOfClass:[self class]]) {
        MyClass *otherObjectAfterCast = (MyClass*)otherObject;

        if ([otherObjectAfterCast.userID isEqualToString:self.userID])
            return YES;
    }

    return NO;
}

从技术上讲,你可能想要使用caseInsensitiveCompare:或类似的东西,但你得到漂移......

isEqual:也可用于触发其他方法 - 在NSString的情况下 - 当两个操作数都是字符串时调用isEqual:会导致调用isEqualToString: - 这就是为什么文档建议调用isEqualToString:如果你知道它们都是字符串,因为它更快一点。

所以,isEqual:就是你所做的一切,或者是作者所定义的任何内容。

这也是文档中非常清晰的定义(一次大声笑):NSObject Protocol Reference

希望这有帮助!如果您需要进一步澄清,请与我们联系。

答案 2 :(得分:0)

简单版就是这个。

==告诉您指针是否是同一个对象。

isEqual:方法系列做了不同的事情。 它们会根据某些条件告诉您指针另一端的对象是否实际相同,例如属性或具有相等值的ivars或所用方法中实现的任何逻辑。它们可能是也可能不是完全相同的对象。