Objective-C - NSObject isEqual,vs. ==比较?

时间:2012-12-26 06:07:27

标签: objective-c ios

  

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

3 个答案:

答案 0 :(得分:19)

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

也就是说,第一种方式是比较指针是否具有相同的值。在这种情况下,很可能他们不会,在第二种情况下,将比较对象。因为它们是以相同的方式初始化的。 (注意,似乎UIButton的{​​{1}}实现结果始终为false。)

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

答案 1 :(得分:14)

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

答案 2 :(得分:5)

提到评论中的差异

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

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