Objective-C – NSObject isEqual,与==比较?

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

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

也就是说,第一种方法比较指针是否具有相同的值。 在这种情况下,他们很可能不会在第二种情况下比较对象。 因为它们被初始化的方式是相同的。 (请注意,在UIButtonisEqual:实现中,结果总是为false。)

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

Prateek的答案和Thomas编辑的答案是正确的。 但是我只是想在处理这种情况时增加一个常见的陷阱/困惑。

考虑这种情况

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

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

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

和下面的代码打印str1 isEqual str2

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

原因是, 通过initWithString传递两个相同的string文字将具有相同的地址来启动 ,所以它们也是同一个对象(参见本文 )。 这是常量数据的优化,这是iOS中的一个function(以及我感觉的许多其他实现)。

但是这不适用于其他types的对象/类。 当你创build2个UIButton它们会完全不同的对象,而btn1btn2 (见问题)将指向不同的地址。

在评论中提到了差异

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

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