NSArray最后一个对象差异的索引

时间:2011-08-20 22:43:08

标签: objective-c nsarray

下面是一个包含两个数组的示例,这些数组为其lastObject返回不同的索引。

NSMutableArray *ary0 = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithObjects:[NSDecimalNumber decimalNumberWithString:@"2"],[NSDecimalNumber one], nil]];
NSLog(@"%d",[ary0 indexOfObject:[ary0 lastObject]]);

按预期记录1。

NSMutableArray *ary1 = [[NSMutableArray alloc] initWithArray:[NSArray arrayWithObjects:[NSDecimalNumber one],[NSDecimalNumber one], nil]];
NSLog(@"%d",[ary1 indexOfObject:[ary1 lastObject]]);

记录0。

我没有看到ary1中lastObject的索引是如何为0,即使ary1中有两个相同的对象。有人可以解释为什么这是有道理的或指出我正在做的非常愚蠢的错误?谢谢!

3 个答案:

答案 0 :(得分:4)

你没有得到最后一个对象的索引,你得到的第一个对象的索引等于最后一个对象。 indexOfObject:记录为从数组的第一个元素到最后一个元素进行搜索,在找到匹配时停止。

答案 1 :(得分:1)

您似乎将两个不同的步骤视为一个连贯的任务。当您向数组询问indexOfObject:时,它会返回该对象的第一个索引。当你向一个数组询问它的lastObject时,它会返回当前的最后一个对象。由于lastObject只返回一个普通的对象引用 - 而不是表示“最后一个对象”的一般概念 - 你不能将它们组合成“最后一个对象的索引”。

因此,您要求的第一个索引包含一个等于[NSDecimalNumber one]的对象(两个数组中的最后一个对象)。第一个数组的答案是索引1是包含第一个数组的第一个数组。对于第二个数组,索引0是第一个包含等于[NSDecimalNumber one]的对象的数据。

顺便提一下,如果你确实想要数组中最后一个对象的索引,那么它肯定是[array count] - 1

答案 2 :(得分:0)

试试这个:

NSLog(@"%p", [NSDecimalNumber one]);
NSLog(@"%p", [NSDecimalNumber one]);

你会看到两者都有相同的地址。它们是同一个对象。调用lastObject时,您将获得一个在数组中存在两次的对象的实例,就像您所说的那样。它存在于索引0和1中。当您调用indexOfObject时,它将返回找到的第一个索引:0。