我正在阅读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]
的替代?
答案 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或所用方法中实现的任何逻辑。它们可能是也可能不是完全相同的对象。