Bien que cette question est ancienne et les choses ont peut être changé, l'on a accepté la réponse est incorrecte.
La plus récente, enumerateObjectsUsingBlock
n'était pas destinée à remplacer pour. La méthode réellement ajoute de nouvelles, différentes fonctionnalités:
- À l'aide de blocs d'énumérer un tableau permet une mise en œuvre à l'utilisation arbitraire de la logique (les blocs générés dans un autre endroit que celui qu'il est appliqué)
- Simultanées d'énumération pour les plus grandes collections lourds ou de calcul (à l'aide de la withOptions:)
Pour-en sur l'autre main est toujours le idiomatiques méthode de l'énumération d'une collection. Il bénéficie de la brièveté de code, de la lisibilité et probablement supplémentaires optimisations du compilateur.
Un test rapide en conclut que, dans l'année 2014 sur iOS 7, enumerateObjectsUsingBlock
est systématiquement 700% plus lent que pour (basé sur 1mm d'itérations de 100 élément de tableau).
La performance est un réel problème ici?
Certainement pas, à de rares exceptions près.
Le point est de démontrer qu'il existe peu ou pas d'avantages à l'aide d' enumerateObjectsUsingBlock
de plus pour les sans une bonne raison. Il ne veut pas rendre le code plus lisible... ou plus... ou le fil de la sécurité (une autre idée fausse très répandue).
Le choix se résume à la préférence personnelle. Comme 7 ans de iOS ingénieur qui a conduit iOS équipes de la construction d'un certains de la plus célèbre des applications iOS, avec des dizaines de millions d'utilisateurs, mon conseil est d'utiliser le plus simple et le plus idiomatique option: dans ce cas, Rapide Énumération utilisant pour.
Le rapide test de code:
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; i++) {
arr[i] = [NSString stringWithFormat:@"%d", i];
}
__block int i;
__block int length;
uint64_t a1 = mach_absolute_time();
i = 1000 * 1000;
while (--i > 0) {
for (NSString *s in arr) {
length = s.length;
}
}
NSLog(@"For-in %llu", mach_absolute_time()-a1);
uint64_t b1 = mach_absolute_time();
i = 1000 * 1000;
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