可能重复:
比较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:
总是假的.)
在大多数情况下使用==
不是你想要的.但是,适当的取决于您的目标.
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
,他们将完全不同的对象无一不btn1
和btn2
问题(见)将指向不同的地址.
提到评论中的差异
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)
归档时间: |
|
查看次数: |
15800 次 |
最近记录: |