【问题标题】:Objective-C -- NSObject isEqual, vs. == comparison? [duplicate]Objective-C - NSObject isEqual,与==比较? [复制]
【发布时间】:2012-12-26 06:07:27
【问题描述】:

可能重复:
Comparing objects in Obj-c

这两种检查对象相等性的方法有什么区别:

UIButton *btn1 = [[UIButton alloc] init];
UIButton *btn2 = [[UIButton alloc] init];

有什么区别:

if (btn1 == btn2) {
  // Run some code
}

if ([btn1 isEqual:btn2]) {
  // Run some code
}

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    第一种方式比较指针,第二种方式比较对象。

    也就是说,第一种方法比较指针是否具有相同的值。在这种情况下,它们很可能不会,在第二种情况下,将比较对象。由于它们的初始化方式相同,因此它们可以相等。 (注意,似乎UIButtonisEqual: 的实现结果总是错误的。)

    在大多数情况下,使用== 不是您想要的。但是,什么是合适的取决于您的目标。

    【讨论】:

    • 对象可能是相等的?? 怎么样?它们将是完全不同的对象..
    • 他很好地回答了你的问题。也许你可以澄清你想要更好地理解的部分,或者举一个你想要完成的例子。
    • @noa 我更新了我原来的答案。我最初的回答很简短。
    • 反对说 在第二种情况下将比较对象。由于它们的初始化方式相同,因此它们可能相等。.. 从问题来看,[btn1 isEqual:btn2] 不可能返回true。所以他们不相等
    • @Krishnabhadra 我已经更新了我的答案。 isEqual: 的实现取决于类。对于UIButton(很可能是UIView),它不会针对不同的实例返回true。但是,在其他情况下,例如 NSMutableString,如果字符串的值相等,则该方法将返回 true。
    【解决方案2】:

    Prateek 的答案和 Thomas 编辑的答案是正确的。但我只是想在处理此类案件时添加一个常见的陷阱/困惑..

    考虑这种情况

     NSString *str1  = [[NSString alloc] initWithString:@"hello"];
     NSString *str2  = [[NSString alloc] initWithString:@"hello"];
    

    理想情况下,str1str2 应该是 2 个不同的字符串对象,str1 和 str2 应该指向不同的地址。但是在代码下面运行会打印str1 == str2

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

    以下代码打印str1 isEqual str2

    if([str1 isEqual:str2]){
        NSLog(@"str1 isEqual str2");
    }
    

    原因是,通过initWithString 传递的两个相同的字符串字面量将具有相同的起始地址,所以它们也是同一个对象(参见this)。这是对常量数据的优化,这是 iOS 中的一个特性(以及我感觉的许多其他实现)。

    但这不适用于其他类型的对象/类。当您创建 2 个 UIButton 时,它们将完全不同的对象,btn1btn2(见问题)将指向不同的地址。

    【讨论】:

    • 在 64 位系统上,这种情况实际上在很多情况下都会发生。具有短值的 NSNumber、NSIndexPath、NSDate 和 NSString 通常在它们相等时具有相同的指针。只有一个[NSNull null],只有一个@[],只有一个@YES,一个@NO。
    【解决方案3】:

    提到的cmets差异

    if (btn1 == btn2) //This compared your pointers
    {
      // Run some code
    }
    

    if ([btn1 isEqual:btn2]) //Compares UIButton object
    {
      // Run some code
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 2013-01-28
      • 2014-08-06
      • 2010-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多