Sebbene questa domanda sia vecchia, le cose non sono cambiate, la risposta accettata non è corretta.
L' enumerateObjectsUsingBlock
API non doveva sostituirsi for-in
, ma per un caso d'uso completamente diverso:
- Consente l'applicazione di logica arbitraria, non locale. cioè non è necessario sapere cosa fa il blocco per usarlo su un array.
- Enumerazione simultanea per grandi raccolte o calcolo pesante (utilizzando il
withOptions:
parametro)
L'enumerazione rapida con for-in
è ancora il metodo idiomatico di enumerare una raccolta.
L'enumerazione rapida beneficia della brevità del codice, della leggibilità e di ulteriori ottimizzazioni che la rendono innaturalmente veloce. Più veloce di una vecchia C for-loop!
Un rapido test ha concluso che nel 2014 su iOS 7 enumerateObjectsUsingBlock
è costantemente più lento del 700% rispetto al for-in (basato su iterazioni di 1 mm di un array di 100 elementi).
Le prestazioni sono una vera preoccupazione pratica qui?
Sicuramente no, con una rara eccezione.
Il punto è quello di dimostrare che c'è poco vantaggio di utilizzare enumerateObjectsUsingBlock:
nel corso for-in
senza una buona ragione. Non rende il codice più leggibile ... o più veloce ... o sicuro per i thread. (un altro malinteso comune).
La scelta dipende dalle preferenze personali. Per me, l'opzione idiomatica e leggibile vince. In questo caso, si tratta dell'enumerazione rapida utilizzando for-in
.
Prova delle prestazioni:
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);
risultati:
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