NSArray индекс последнего несоответствия объекта - PullRequest
2 голосов
/ 21 августа 2011

Ниже приведен пример, содержащий два массива, которые возвращают разные индексы для своего 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 есть два одинаковых объекта.Может кто-нибудь объяснить, почему это имеет смысл, или указать на очень глупую ошибку, которую я совершаю?Спасибо!

Ответы [ 3 ]

4 голосов
/ 21 августа 2011

Вы не получаете индекс последнего объекта, вы получаете индекс первого объекта, который равен последнему объекту. indexOfObject: задокументирован как поиск от первого элемента массива до последнего, остановка при обнаружении совпадения.

1 голос
/ 21 августа 2011

Вы, похоже, рассматриваете два разных шага как одно связное задание.Когда вы запрашиваете массив для indexOfObject:, он возвращает индекс first для этого объекта.И когда вы запрашиваете массив для lastObject, он возвращает текущий последний объект.Поскольку lastObject просто возвращает нормальную ссылку на объект - а не что-то, представляющее общую идею «последнего объекта» - вы не можете объединить их, чтобы обозначить «индекс последнего объекта».

Таким образом, вызапрашивают первый индекс, который содержит объект, равный [NSDecimalNumber one] (последний объект в обоих массивах).Ответ для первого массива состоит в том, что индекс 1 является первым, который содержит, что равно этому.Для второго массива индекс 0 является первым, который содержит объект, равный [NSDecimalNumber one].

Кстати, если вы хотите, чтобы индекс последнего объекта в массиве гарантированно был[array count] - 1.

0 голосов
/ 21 августа 2011

Попробуйте это:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...