15

可能重复:
比较 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
}
4

3 回答 3

19

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

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

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

于 2012-12-26T06:10:04.093 回答
15

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见问题)将指向不同的地址。

于 2012-12-26T06:43:39.103 回答
5

评论中提到的差异

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

if ([btn1 isEqual:btn2]) //Compares UIButton object
{
  // Run some code
}
于 2012-12-26T06:12:01.893 回答