Objective-C中的身份与平等

时间:2016-07-09 15:45:45

标签: objective-c nsstring

以下代码是我在一篇关于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。

1 个答案:

答案 0 :(得分:1)

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

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