【问题标题】:Is it good form to always use isEqual: in Objective-C for object comparison? [duplicate]总是使用 isEqual: 在 Objective-C 中进行对象比较是一种好的形式吗? [复制]
【发布时间】:2013-04-04 18:52:44
【问题描述】:

我知道== 通常适用于对象比较,在您比较指向同一对象的变量的情况下。然而,即使在这些情况下,我认为isEqual: 总是有效的。

当您认为您正在比较指针时尝试使用== 更好,还是应该在不比较原语时始终使用isEqual:

我倾向于认为通过始终使用isEqual:,您可以更轻松地一眼看出代码是否存在错误。

【问题讨论】:

标签: objective-c cocoa-touch cocoa


【解决方案1】:

使用==,如您所说,将比较指针。使用它,您可以知道这两个对象是否是同一个实例。

通过使用isEqual:,您可以比较它们的值。

两个不同的 NSString 可以包含相同的文本:Hello World!。它们的地址将不同(两个不同的对象),但它们的值将相同。

在这种情况下,== 将返回 NOisEqual: 应返回 YES

示例:

NSString* str1 = @"Hello World!";
NSString* str2 = [@"Hello " stringByAppendingString:@"World!"];

if (str1 == str2)
{
    NSLog(@"str1 == str2");
}

if ([str1 isEqualToString:str2])
{
    NSLog(@"str1 is equal to str2");
}

只会输出:

2013-04-04 21:04:18.365 测试[7310:303] str1 等于 str2

注意事项:

我没用过:

NSString* str1 = @"Hello World!";
NSString* str2 = @"Hello World!";

因为编译器会为文字生成单个对象。在这种情况下,两个等式(==isEqual:)都会得到满足。

【讨论】:

    【解决方案2】:

    我认为两者之间有一个重要的区别。

    假设您测量房屋左右墙的长度: 左墙长 = 5 米,右墙长 = 5 米

    isEqual 会告诉您两个测量值的距离相同 (5m)

    == 会告诉您,您不只是测量同一面墙两次。

    我希望这是有道理的

    【讨论】:

    • 详细说明:isEqual 因此不是无错误代码的标志。只要有机会就应该使用 ==,因为它比 isEqual 更有效。
    • 谢谢,也许这是一个措辞不当的问题,因为你似乎是唯一一个知道我在问什么的人!
    • 不,你不应该使用==“只要你有机会,因为它比isEqual更有效:”。这会在奇怪的地方断裂,并且可能会随着时间的推移而断裂。考虑NSNumber[NSNumber numberWithInt:5] 在大多数平台/运行时返回一个单例。但42 仅在某些平台上有效。您将== 用于NSNumber 会导致不同平台上的不同行为,甚至不同操作系统版本之间的不同行为。
    • 在接受这个答案时,我没有注意关于速度的评论。我喜欢的是他的数据结构示例,这让我明白了为什么您可能会仔细考虑是在进行指针还是对象值比较,而不是总是对对象使用 isEquals。
    • @AndrewJohnson 是的——这几乎是一个很好的类比,但它在真实代码中被打破了。如果您要在 NSNumber 的两个实例中存储两个“5”的测量值,== 会说它们相等,因为 NSNumber 总是为包含 5 的 NSNumber 返回相同的对象。指针相等 只能用于确定两个对象是否是不同的分配。两个分配不同的对象——在内存中具有不同的地址——可能相等也可能不相等,只有isEqual:可以用来确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2013-06-12
    • 1970-01-01
    • 2013-08-03
    相关资源
    最近更新 更多