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 是同一个对象。
以下代码是我从关于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 是同一个对象。