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

Mat*_* H. 14 objective-c ios

可能重复:
比较Obj-c中的对象

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

UIButton *btn1 = [[UIButton alloc] init];
UIButton *btn2 = [[UIButton alloc] init];
Run Code Online (Sandbox Code Playgroud)

有什么区别:

if (btn1 == btn2) {
  // Run some code
}
Run Code Online (Sandbox Code Playgroud)

if ([btn1 isEqual:btn2]) {
  // Run some code
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*asW 19

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

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

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

  • **对象很可能相等??**怎么样?他们将是完全不同的对象.. (5认同)
  • @Krishnabhadra我已经更新了我的答案.`isEqual:`的实现取决于类.在"UIButton"(很可能是"UIView")的情况下,对于不同的实例,它不会返回true.但是,在其他情况下,例如使用`NSMutableString`,如果字符串的值相等,则该方法将返回true. (2认同)

Kri*_*dra 14

Prateek的回答和托马斯的编辑答案是正确的.但我只是想在处理这类案件时增加一个常见的陷阱/混乱.

考虑这种情况

 NSString *str1  = [[NSString alloc] initWithString:@"hello"];
 NSString *str2  = [[NSString alloc] initWithString:@"hello"];
Run Code Online (Sandbox Code Playgroud)

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

if(str1 == str2){
    NSLog(@"str1 == str2");
}
Run Code Online (Sandbox Code Playgroud)

以下代码打印 str1 isEqual str2

if([str1 isEqual:str2]){
    NSLog(@"str1 isEqual str2");
}
Run Code Online (Sandbox Code Playgroud)

原因是,传递initWithString两个相同的字符串文字将具有相同的地址开始,因此它们也是同一个对象(参见此内容).这是常量数据的优化,这是iOS中的一个功能(我感觉很多其他实现).

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


P.J*_*P.J 5

提到评论中的差异

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

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