#iphone #objective-c #ios #collections #nsarray
#iPhone #objective-c #iOS #Коллекции #nsarray
Вопрос:
Есть ли простой способ выполнить быстрое перечисление для ряда объектов в массиве? Что-то вроде…
for (Object *object in myArray startingAtIndex:50) {
//do stuff
}
…чтобы избежать необходимости делать что-то подобное…
for (Object *object in myArray) {
NSUInteger index = [myArray indexOfObject:object];
if (index >= 50) {
//do stuff
}
}
Спасибо.
Ответ №1:
Если myArray
является неизменяемым, то, subArrayWithRange:
вероятно, копирование указателей не выполняется, хотя, retain
вероятно, все равно должно быть отправлено всему подмассиву.
В целом, это действительно не имеет значения. Честно говоря, я никогда не видел случая, когда быстрое перечисление против indexOfObject:
было достаточной проблемой производительности, чтобы привлечь внимание (всегда было что-то хуже. :).
Другой подход; используйте enumerateBlock:
и просто возвращайте индексы из ranger (и используйте флаг stop).
[myArray enumerateWithBlock: ^(id o, NSUInteger i, BOOL *f) {
if (i < 10) return;
if (i > 20) { *f = YES; return; }
... process objects in range ...
}];
(Вы могли бы даже использовать options:
вариант для одновременного перечисления.)
Комментарии:
1. 1 — хотя я не использовал решение, это тоже хороший совет.
Ответ №2:
Это приходит мне на ум:
for (Object *object in [myArray subArrayWithRange:NSMakeRange(50, ([myArray count] - 49))]) {
//do stuff
}
Который, однако, создает временный массив, что потенциально может быть медленнее (сравните его!), чем перечисление вручную, подобное этому:
NSUInteger arrayCount = [myArray count];
for (NSUInteger i = 50; i < arrayCount; i ) {
Object *object = [myArray objectAtIndex];
// do stuff
}
Комментарии:
1. То, что быстрее, должно определяться профилированием.
subArrayWithRange:
Метод может быть быстрее.2. Вы имеете в виду ‘i < arrayCount’ 🙂