Вы увидите, что оба имеют один и тот же адрес. Это один и тот же объект. При вызове lastObject вы получаете экземпляр объекта, который существует в массиве дважды, как вы сказали. Он существует в индексах 0 и 1. Когда вы вызываете indexOfObject, он возвращает первый найденный индекс: 0.

приведен пример, содержащий два массива, которые возвращают разные индексы для своего 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.

Я не вижу, как индекс lastObject в ary1 равен 0, даже если в ary1 есть два идентичных объекта. Может кто-нибудь объяснить, почему это имеет смысл, или указать на очень глупую ошибку, которую я совершаю? Спасибо!