Objective-C——对象相等,与==比较?
可能重复:Objective-C——对象相等,与==比较?,objective-c,ios,Objective C,Ios,可能重复: 这两种检查对象相等性的方法之间的区别是什么: UIButton *btn1 = [[UIButton alloc] init]; UIButton *btn2 = [[UIButton alloc] init]; 以下两者之间的区别是什么: if (btn1 == btn2) { // Run some code } 及 第一种方法比较指针,而第二种方法比较对象 也就是说,第一种方法比较指针是否具有相同的值。在这种情况下,很可能它们没有,在第二种情况下,将比较对象。由于它们
这两种检查对象相等性的方法之间的区别是什么:
UIButton *btn1 = [[UIButton alloc] init];
UIButton *btn2 = [[UIButton alloc] init];
以下两者之间的区别是什么:
if (btn1 == btn2) {
// Run some code
}
及
第一种方法比较指针,而第二种方法比较对象 也就是说,第一种方法比较指针是否具有相同的值。在这种情况下,很可能它们没有,在第二种情况下,将比较对象。由于它们的初始化方式相同,因此它们可以相等。(注意,
ui按钮
实现的isEqual:
结果总是错误的。)
在大多数情况下,使用
==
不是您想要的。然而,什么是合适的取决于你的目标。在评论中提到了不同之处
if (btn1 == btn2) //This compared your pointers
{
// Run some code
}
及
普拉蒂克的答案和托马斯编辑的答案是正确的。但我只想在处理此类案件时添加一个常见的陷阱/困惑 考虑一下这个例子
NSString *str1 = [[NSString alloc] initWithString:@"hello"];
NSString *str2 = [[NSString alloc] initWithString:@"hello"];
理想情况下,str1
和str2
应该是两个不同的字符串对象,str1和str2应该指向不同的地址。但是在下面运行代码会打印出str1==str2
if(str1 == str2){
NSLog(@"str1 == str2");
}
if([str1 isEqual:str2]){
NSLog(@"str1 isEqual str2");
}
和下面的代码打印str1 isEqual str2
if(str1 == str2){
NSLog(@"str1 == str2");
}
if([str1 isEqual:str2]){
NSLog(@"str1 isEqual str2");
}
原因是,通过initWithString
传递的两个相同的字符串文字将具有相同的起始地址,因此它们也是相同的对象(请参阅)。这是对常量数据的优化,这是iOS中的一个特性(我觉得还有许多其他实现)
但这对其他类型的对象/类不起作用。当您创建2个
ui按钮时,它们将指向完全不同的对象,btn1
和btn2
(参见问题)将指向不同的地址 对象可能是相等的??怎样?他们将是完全不同的对象1.他很好地回答了你的问题。也许你可以澄清你想更好地理解哪一部分,或者举个例子说明你想完成什么。@noa我更新了我原来的答案。我最初的回答很简单。投票赞成在第二种情况下对物体进行比较。因为它们是以相同的方式初始化的,所以它们很可能是相等的。。。从这个问题来看,没有办法[btn1 isEqual:btn2]
返回true
。所以他们不是equal@Krishnabhadra我已经更新了我的答案。isEqual:
的实现取决于类。在ui按钮
(很可能是ui视图
)的情况下,对于不同的实例,它不会返回true。但是,在其他情况下,例如使用NSMutableString
,如果字符串的值相等,则该方法将返回true。在64位系统上,实际上在许多情况下都会发生这种情况。具有短值的NSNumber、NSIndexPath、NSDate和NSString在相等时通常具有相同的指针。只有一个[NSNull null],只有一个@[],只有一个@YES和一个@NO。