Bien que cette question soit ancienne, les choses n'ont pas changé, la réponse acceptée est incorrecte.
L' enumerateObjectsUsingBlock
API n'était pas censée remplacer for-in
, mais pour un cas d'utilisation totalement différent:
- Il permet l'application d'une logique arbitraire et non locale. c'est-à-dire que vous n'avez pas besoin de savoir ce que fait le bloc pour l'utiliser sur un tableau.
- Énumération simultanée pour les grandes collections ou les calculs lourds (à l'aide du
withOptions:
paramètre)
L'énumération rapide avec for-in
est toujours la méthode idiomatique d'énumération d'une collection.
Fast Enumeration bénéficie de la brièveté du code, de la lisibilité et des optimisations supplémentaires qui le rendent anormalement rapide. Plus rapide qu'une ancienne boucle for C!
Un test rapide conclut qu'en 2014 sur iOS 7, il enumerateObjectsUsingBlock
est systématiquement 700% plus lent que for-in (basé sur des itérations de 1 mm d'un tableau de 100 éléments).
La performance est-elle ici une réelle préoccupation pratique?
Certainement pas, à de rares exceptions près.
Le but est de démontrer qu'il y a peu d'avantages à utiliser enumerateObjectsUsingBlock:
over for-in
sans une très bonne raison. Cela ne rend pas le code plus lisible ... ni plus rapide ... ni thread-safe. (une autre idée fausse courante).
Le choix se résume à une préférence personnelle. Pour moi, l'option idiomatique et lisible gagne. Dans ce cas, c'est l'énumération rapide utilisant for-in
.
Référence:
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);
Résultats:
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