У меня есть NSArray
и нужно перебирать его в специальном случае назад, чтобы я сначала посмотрел на последний элемент. Это по соображениям производительности: если последнее просто не имеет смысла, все предыдущие можно игнорировать. Поэтому я хотел бы разбить цикл. Но это не сработает, если я перейду от 0 до n. Мне нужно перейти от n к 0. Возможно, есть способ или функция, о которых я не знаю, поэтому мне не пришлось бы изобретать колесо здесь.
Есть ли простой способ перебора NSArray назад?
Ответ 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]