【问题标题】:Should you use 'isEqual' or '=='?你应该使用'isEqual'还是'=='?
【发布时间】:2010-09-18 10:19:15
【问题描述】:

我在 SO 上看到了几个问题,其中包括函数 isEqual: 而不是标准的 ==

到目前为止,我只学会了使用==,所以我想知道哪个更好用,各有什么优缺点?你应该什么时候使用它们?

谢谢。

【问题讨论】:

    标签: iphone objective-c comparison equality equals-operator


    【解决方案1】:

    他们做不同的事情;所以你需要使用合适的:

    考虑一下,如果你愿意:

    NSString *a = @"Hello!";
    NSString *b = a;
    NSString *c = [a mutableCopy];
    
    if (a == b) NSLog(@"This prints");
    if (b == c) NSLog(@"This doesn't");
    if ([a isEqual:c]) NSLog(@"This does");
    

    换句话说; == 只检查两个指针​​是否指向同一个地方,因此是同一个对象; isEqual: 检查两个对象是否相等;在这种情况下ab 是同一个字符串,而c 是一个等于a 的新字符串,因为它具有相同顺序的相同字符;但它有不同的类和不同的地址。

    您几乎总是希望将isEqual: 用于对象,并且如果它们有它,如果它们属于同一类(例如isEqualToString:),则使用更具体的比较器。

    == 另一方面,您可能应该只用于整数数据类型。 (它们对对象意义不大,对浮点数意义不大。)

    【讨论】:

    • 小心,[a copy] 可能返回相同的对象,因为它是不可变的字符串。
    • dreamlax:是的,为了清晰起见已更新答案;我确实相信复制一个 NSConstStr 会产生一个 NSConcreteImmutableString;我可能错了。
    • @Williham Totland:将副本发送到常量字符串只会给您返回相同的指针。
    • 所以isEqual 可以为真(两个相同的对象),而== 为假(指向内存中两个相同对象所在的不同位置)。另一方面,如果== 为真,那么isEqual 就不可能为假?
    • @JakubTruhlář 不完全是。如果实现 isEqual 以对同一对象返回 false,那么它会。 (例如,像 SQLNull 这样的东西可以做到这一点,即使 [SQLNull sharedNull] == [SQLNull sharedNull] 为真,[[SQLNull sharedNull] isEqual:[SQLNull sharedNull]] 也会给出假,因为在我们假定的 SQLNull 类中,- (BOOL)isEqual:(id)b { return NO; }
    【解决方案2】:

    isEqual 将根据为接收者对象编写的方法比较对象

    == 比较对象的地址(或它们的值对于 C 类型变量,如 ints)

    这意味着 NSStrings == 比较地址,但 isEquals: 将查看字符串对象的值,因此类似于 strcmp 的操作

    请注意,许多字符串都被保留,因此如果它们的数据相同,它们的地址也相同,因此 == 可以在测试用例中工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-14
      • 2018-09-05
      • 2011-08-18
      • 2012-02-10
      • 2015-07-26
      • 2011-07-20
      相关资源
      最近更新 更多