Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C——对象相等,与==比较?_Objective C_Ios - Fatal编程技术网

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。