以下代码是我在一篇关于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&#34 ;.我理解代码的第2部分的第二个问题是,我不知道它们是如何平等的。 (与我在第1部分中的问题类似。)
我再次不知道为什么测试身份的最后一行代码会为不等于返回NO。
答案 0 :(得分:1)
你的假设是错误的。 Objective-C不保证对相同数据使用不同的对象。恰恰相反,尽可能使用相同的对象。例如,只有两个[NSNumber numberWithBool]对象,只有一个空数组对象,只有一个[NSNull null]对象等。
在64位代码中,具有合理大小相等整数的所有NSNumber对象都是相同的对象。具有小的相等字符串的所有NSString对象都是相同的对象等。如果对象是不可变的,则copy方法返回相同的对象。