Bu soru eski olmasına rağmen işler değişmedi, kabul edilen cevap yanlış.
enumerateObjectsUsingBlock
API supersede demek değildifor-in
ama tamamen farklı kullanım durumda,:
- Keyfi, yerel olmayan mantığın uygulanmasına izin verir. yani bloğun bir dizide kullanmak için ne yaptığını bilmenize gerek yoktur.
- Büyük koleksiyonlar veya ağır hesaplama için eşzamanlı numaralandırma (
withOptions:
parametreyi kullanarak )
Hızlı Sayım for-in
hala deyimsel bir koleksiyon sıralandıran yöntemi.
Hızlı Numaralandırma, kodun kısalığı, okunabilirliği ve doğal olmayan hızlı hale getiren ek optimizasyonlardan yararlanır. Eski bir C for-loop'tan daha hızlı!
Hızlı bir test, iOS 7'de 2014 yılında, girişe göre enumerateObjectsUsingBlock
sürekli olarak% 700 daha yavaş olduğu sonucuna varıyor (100 öğe dizisinin 1 mm yinelemelerine dayanarak).
Performans burada gerçek bir pratik kaygı mıdır?
Kesinlikle hayır, nadir istisna dışında.
Nokta küçük yararı kullanmanın olduğunu göstermektir enumerateObjectsUsingBlock:
üzerindefor-in
gerçekten iyi bir neden olmadan. Kodu daha okunabilir ... veya daha hızlı ... veya iş parçacığı açısından güvenli hale getirmez. (başka bir yaygın yanlış anlama).
Seçim kişisel tercihe bağlıdır. Benim için deyimsel ve okunabilir seçenek kazanıyor. Bu durumda, bu Hızlı Numaralandırma kullanarak for-in
.
Karşılaştırma:
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);
Sonuçlar:
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