Хотя этот вопрос старый, ничего не изменилось, принятый ответ неверен
enumerateObjectsUsingBlock
API не предназначался для замены for-in
, но для совершенно другого варианта использования:
- Это позволяет применять произвольную нелокальную логику. то есть вам не нужно знать, что делает блок, чтобы использовать его в массиве.
- Параллельное перечисление для больших коллекций или тяжелых вычислений (с использованием параметра
withOptions:
)
Быстрое перечисление с for-in
по-прежнему является идиоматическим методом перечисления коллекции.
Быстрое перечисление выигрывает от краткости кода, удобочитаемости и дополнительных оптимизаций, которые делают его неестественно быстрым. Быстрее, чем старый цикл for C!
Быстрый тест показывает, что в 2014 году на iOS 7 enumerateObjectsUsingBlock
стабильно на 700 % медленнее, чем for-in (на основе 1 мм итераций массива из 100 элементов).
Является ли здесь производительность реальной практической проблемой?
Точно нет, за редким исключением.
Смысл в том, чтобы продемонстрировать, что использование enumerateObjectsUsingBlock:
вместо for-in
без действительно веской причины малоэффективно. Это не делает код более читабельным... или быстрым... или потокобезопасным. (еще одно распространенное заблуждение).
Выбор зависит от личных предпочтений. Для меня выигрывает идиоматический и читабельный вариант. В данном случае это быстрое перечисление с использованием for-in
.
Ориентир:
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; i++) {
arr[i] = [NSString stringWithFormat:@"%d", i];
}
int i;
__block NSUInteger length;
i = 1000 * 1000;
uint64_t a1 = mach_absolute_time();
while (--i > 0) {
for (NSString *s in arr) {
length = s.length;
}
}
NSLog(@"For-in %llu", mach_absolute_time()-a1);
i = 1000 * 1000;
uint64_t b1 = mach_absolute_time();
while (--i > 0) {
[arr enumerateObjectsUsingBlock:^(NSString *s, NSUInteger idx, BOOL *stop) {
length = s.length;
}];
}
NSLog(@"Enum %llu", mach_absolute_time()-b1);
Результаты:
2014-06-11 14:37:47.717 Test[57483:60b] For-in 1087754062
2014-06-11 14:37:55.492 Test[57483:60b] Enum 7775447746
person
Adam Kaplan
schedule
11.06.2014