Objective-C 中的身份与平等

Identity vs. Equality in Objective-C

以下代码是我从关于objective-c的讲座中摘录的片段,旨在说明objective-c中身份和平等之间的区别。

有几件事我不明白,由于代码的一部分与另一部分相关,所以我完整地复制了代码。

第一部分:

// test for object identity:
NSString *a = @“Peter”;
NSString *b = @“Peter";
BOOL identical = a == b;  //YES

我不明白 objective-c 编译器如何得出对象 a 与对象 b 相同的结论。我意识到它们都包含完全相同的字符串,即 "Peter",但我认为由于 a 和 b 是独立的对象,因此它们各自具有唯一的内存地址,而且我认为= 运算符然后将测试它而不是测试 a 和 b 是否包含相同的字符串。

第 2 部分:

// test for string equality: will return YES
NSString *aName = @"Peter";
NSMutableString *anotherName =
  [NSMutableString stringWithString:@"P"];

 [anotherName appendString:@"eter"];

BOOL equal = [aName isEqualToString:anotherName]; //YES 
BOOL identical = (aName == anotherName); //NO

我理解这段代码首先创建了一个对象 aName,即 "Peter" 和 anotherName,即 "P"。

下一点我没听懂。我理解这个的第一个问题: "eter" 在我们测试相等性之前在独立语句中附加到 anotherName 但据我所知,即使我们说

[anotherName appendString:@"eter"];

我们没有将这个结果存储在任何地方,所以当我们询问 anotherName 是否等于 aName 中的字符串时,我会认为 anotherName 仍然只是 "P"。我在理解代码的第 2 部分时遇到的第二个问题是,我看不出它们是如何相等的。 (类似于我在第 1 部分中遇到的问题。)

同样,我不知道为什么测试身份的最后一行代码 return NO 因为 不等于

你的假设是错误的。 Objective-C 不保证对相同的数据使用不同的对象。恰恰相反,尽可能使用同一个对象。例如只有两个 [NSNumber numberWithBool] 对象,只有一个空数组对象,只有一个 [NSNull null] 对象等

在 64 位代码中,所有具有合理大小的相等整数的 NSNumber 对象都是相同的对象。所有具有小的相等字符串的 NSString 对象都是同一个对象等。如果对象是不可变的,则复制方法 returns 是同一个对象。