可能重复:
比较 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
}
可能重复:
比较 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
}
第一种方式比较指针,而第二种方式比较对象。
也就是说,第一种方法比较指针是否具有相同的值。在这种情况下,它们很可能不会,在第二种情况下,将比较对象。由于它们的初始化方式相同,因此它们可以相等。UIButton
(注意,结果的' 实现似乎isEqual:
总是错误的。)
在大多数情况下,使用==
不是您想要的。但是,什么是合适的取决于您的目标。
Prateek 的答案和 Thomas 的编辑答案是正确的。但我只是想在处理此类案件时添加一个常见的陷阱/困惑..
考虑这种情况
NSString *str1 = [[NSString alloc] initWithString:@"hello"];
NSString *str2 = [[NSString alloc] initWithString:@"hello"];
理想情况下str1
,str2
应该是 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
,它们将完全不同的对象,并且两者btn1
(btn2
见问题)将指向不同的地址。
评论中提到的差异
if (btn1 == btn2) //This compared your pointers
{
// Run some code
}
和
if ([btn1 isEqual:btn2]) //Compares UIButton object
{
// Run some code
}