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