相同和平等的区别?

时间:2012-01-24 21:54:18

标签: objective-c

我无法理解两件事情是平等的,两件事情是相同的。令我困惑的是声明“两个对象可以是相同的,这意味着它们是相同的。但是,两个相等的对象并不相同。”请有人帮我理解差异吗?感谢。

3 个答案:

答案 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:测试。

<强>结论

==运算符通常仅用于“原始”数据类型 - intfloatNSInteger等 - 以及此类类型的结构 - 例如的NSRect。这些是确定相等的类型。

isEqual:方法通常用于Obj-C对象 - 您通常不想知道框是否包含相同的名称(==将确定的是什么),但是否这些名称所引用的内容在语义上是等价的 - 这是isEqual:确定的内容。

答案 2 :(得分:0)

相同通常意味着它们在内存中是相同的对象(占用相同的内存占用量)。 等于通常意味着它们的属性值相同。