Есть ли простой способ перебора NSArray назад?

У меня есть NSArray и нужно перебирать его в специальном случае назад, чтобы я сначала посмотрел на последний элемент. Это по соображениям производительности: если последнее просто не имеет смысла, все предыдущие можно игнорировать. Поэтому я хотел бы разбить цикл. Но это не сработает, если я перейду от 0 до n. Мне нужно перейти от n к 0. Возможно, есть способ или функция, о которых я не знаю, поэтому мне не пришлось бы изобретать колесо здесь.

Ответ 1

Чтобы добавить другие ответы, вы можете использовать -[NSArray reverseObjectEnumerator] в сочетании с функцией быстрого перечисления в Objective-C 2.0 (доступно в Leopard, iPhone):

for (id someObject in [myArray reverseObjectEnumerator])
{
    // print some info
    NSLog([someObject description]);
}

Источник с дополнительной информацией: http://cocoawithlove.com/2008/05/fast-enumeration-clarifications.html

Ответ 2

Так как это для performace, у вас есть несколько вариантов, и было бы неплохо пробовать их всех, чтобы увидеть, какие из них лучше всего работают.

  • [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:…]
  • -[NSArray reverseObjectEnumerator]
  • Создайте обратную копию массива, а затем выполните итерацию, которая обычно
  • Используйте стандартный цикл C для запуска и запускайте работу по массиву.

Более экстремальные методы (если производительность является суперкритической)

  • Прочитайте, как Cocoa реализует быстрое перечисление объектов и создает собственный эквивалент в обратном порядке.
  • Используйте массив C или С++.

Могут быть и другие. В этом случае любой пользователь может добавить его.

Ответ 3

От здесь:

 NSEnumerator* myIterator = [myArray reverseObjectEnumerator];
 id anObject;

 while( anObject = [myIterator nextObject])
 {
     /* do something useful with anObject */
 }

Ответ 4

[NsArray reverseObjectEnumerator]