我无法理解两件事情是平等的,两件事情是相同的。令我困惑的是声明“两个对象可以是相同的,这意味着它们是相同的。但是,两个相等的对象并不相同。”请有人帮我理解差异吗?感谢。
答案 0 :(得分:5)
在objective-c中,稍微伪代码......
NSString * a = @"hello";
NSString * b = @"hello";
a == a //they are identical (the same object)
[a isEqualToString:a]; //they are equal.
a != b //Even though the string contents are the same they are not the same object.
[a isEqualToString:b]; // they aren't identical but they are equal.
关于这个主题的一篇很长很好的博客文章,请参阅
http://www.karlkraft.com/index.php/2008/01/07/equality-vs-identity/
答案 1 :(得分:2)
欢迎光临盒子世界......(图片效果更好,道歉我没有包括在内)
<强>序言强>
当你写:
int x;
你要的是一个框,它能够持有 int 并将其名称与 x 等同 - 所有框都有一个内部名称,它究竟是什么并不重要。所以现在你写的时候:
x = 4;
您要求将值 4存储在名称 x 引用的框中。盒子通常被称为“变量”。这种盒子的使用是计算机编程与数学不同的原因,你可以写:
x = x + 1;
在计算机编程中,但不在数学中!这意味着“转到 x 引用的框,将值复制出来,将其添加1,将值重新放回到同一个框中”。
现在,不同类型的盒子(意味着可以存储在其中的盒子)可以“粘合”在一起形成多隔间盒子。整个集合由一个名称引用,各个框由两个名称引用 - 一个用于集合,一个用于单个框。这些盒子集合在术语“记录”,“结构”,“对象”等下以不同的编程语言出现。
最后,你能把什么放在一个盒子里?答案(取决于编程语言的规则)是任何,其中包括其他框的名称。例如。你可以写:
int *y;
要求一个能够保存“包含整数的框的名称”的框并调用此框 y 。这种盒子通常被称为“指针变量”或“参考变量”
==
与isEqual
在Objective-C中,==
运算符查看两个框的内容并确定它们是否包含相同的值 - 并且值可能是另一个盒子的名字。
isEqual
方法仅对包含其他框名称的框(某些受限类型)起作用。它查看这两个框,使用这些框中的名称来定位另外两个框,然后比较这些框的内容。如果它比较的方框本身包含其他包含更多方框名称的方框,那么它会遍历那些进一步比较它们的方框等。
此外isEqual
不需要比较完全相等,但允许比较“意味着相同的东西”。例如。如果您创建两个包含相同键/值对的词典但是它们以不同的顺序输入,则构成这两个词典的框的排列可能不相同,但在语义上它们是相同的 - isEqualDictionary:
方法定义为:
如果两个词典各自具有相同数量的条目,则两个词典具有相同的内容;对于给定的键,每个词典中的相应值对象满足
isEqual:
测试。
<强>结论强>
==
运算符通常仅用于“原始”数据类型 - int
,float
,NSInteger
等 - 以及此类类型的结构 - 例如的NSRect。这些是值确定相等的类型。
isEqual:
方法通常用于Obj-C对象 - 您通常不想知道框是否包含相同的名称(==
将确定的是什么),但是否这些名称所引用的内容在语义上是等价的 - 这是isEqual:
确定的内容。
答案 2 :(得分:0)
相同通常意味着它们在内存中是相同的对象(占用相同的内存占用量)。 等于通常意味着它们的属性值相同。