Следует ли по возможности избегать обращения к NSMutableArray? - PullRequest
4 голосов
/ 14 сентября 2011

Предположим, у меня есть NSNumbers 1 - 450. Я могу добавить их в NSMutableArray, начиная с 1 и заканчивая 450, или начиная с 450 и заканчивая 1. Мой код был бы немного проще, если бы я мог начать с 1 и заканчивая 450, но когда мне, наконец, придет время перечислить массив, мне, в конечном счете, придется обратить его вспять. Другими словами, мне нужно, чтобы первый объект в перечислении был 450, а последний - 1.

Поскольку мой код будет проще, если я сделаю это таким образом (добавьте, начиная с 1, а затем переверните его перед перечислением), это мой предпочтительный метод. Однако в документации Apple для - (NSEnumerator *)reverseObjectEnumerator написано:

Более эффективно использовать протокол быстрого перечисления (см. NSFastEnumeration). Быстрое перечисление доступно в Mac OS X v10.5 и позже и iOS 2.0 и позже.

Так стоит ли мне избегать обращения к массиву и просто писать немного более сложный код, чтобы NSMutableArray создавался в нужном порядке?

Ответы [ 2 ]

7 голосов
/ 14 сентября 2011

Вы можете использовать быстрое перечисление с экземпляром NSEnumerator, документация о быстром перечислении даже использует в качестве примера метод reverseObjectEnumerator::

NSEnumerator *enumerator = [array reverseObjectEnumerator];
for (NSString *element in enumerator) {
    //...
}

Кроме того, ваш вопросзвучит очень похоже на преждевременную оптимизацию ...

1 голос
/ 14 сентября 2011

Нет, вам не нужно писать более сложный код, чтобы разместить его в правильном порядке. ReverseObjectEnumerator будет работать нормально, он лишь немного медленнее. Если производительность является серьезной проблемой, любой из приведенных ниже фрагментов будет работать хорошо (более быстрый из двух - цикл while)

// Assuming 'array' is your NSMutableArray
int i = [array count];
while(i--) {
  Object *current = [array objectAtIndex:i];
  // Mess around with current
}

Это начнёт вас с 450 и закончится на 0. Вы также можете сделать это с помощью цикла for, хотя вам нужно убедиться, что вы либо начинаете с индекса 449, либо делаете что-то вроде

for(int i = [array count]; i > 0 ; i--) {
  Object *curreyt = [array objectAtIndex:i-1];
  // Mess around with current
}
...