이 질문은 오래되었지만 내용이 변경되지 않았지만 허용 된 답변이 잘못되었습니다.
enumerateObjectsUsingBlock
API는보다 우선 의미되지 않았다 for-in
하지만 완전히 다른 사용 사례 :
- 임의의 로컬이 아닌 논리를 적용 할 수 있습니다. 즉, 배열에서 블록을 사용하기 위해 블록이 무엇을하는지 알 필요가 없습니다.
- 대규모 수집 또는 대량 계산을위한 동시 열거 (
withOptions:
매개 변수 사용)
Fast Enumeration with with for-in
는 여전히 컬렉션을 열거하는 관용적 방법입니다.
빠른 열거 형은 코드의 간결성, 가독성 및 추가 최적화 를 통해 자연스럽게 빠릅니다. 오래된 C for-loop보다 빠릅니다!
빠른 테스트에 따르면 iOS 7의 2014 년에 enumerateObjectsUsingBlock
for-in보다 700 % 느리게 (100 개 항목 배열의 1mm 반복을 기준으로) 느립니다.
여기서 성능이 실질적인 관심사입니까?
드물지만 예외는 아닙니다.
요점은 실제로 정당한 이유없이 enumerateObjectsUsingBlock:
over 를 사용하면 이점이 거의 없음을 보여주는 것입니다 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