在程序開發(fā)中最常用的應(yīng)該就是for循環(huán)對對象的遍歷如NSArray, NSSet 或者NSDictionary??此迫菀妆缓鲆暤狞c其實很影響app的性能開發(fā)。今天就對這個就自己的理解發(fā)表下自己的看法。
一.for循環(huán)的幾種方法
1.1 最常用的循環(huán)方式
NSArray *testArray = @[@1,@2,@3,@4];
for(int a = 0; a < testArray.count; a++){
NSLog(@"%@",testArray[a]);
}
這段代碼最大的問題就是循環(huán)每進行一次我們都會調(diào)用數(shù)組的計數(shù)方法. 數(shù)組的總數(shù)是不會改變的,因此每次都去調(diào)用一下這種做法是多余的。常用的優(yōu)化如下:
NSArray *testArray = @[@1,@2,@3,@4];
NSUInteger count = testArray.count;
for(int a = 0; a < count; a++){
NSLog(@"%@",testArray[a]);
}
1.2 快速枚舉
快速枚舉是在 Objective-C 2.0 中作為傳統(tǒng)的NSEnumerator的更便利的替代方法而引入的,新的方法順便帶來了一種新的循環(huán)語法, for…in 循環(huán)。
NSArray *testArray = @[@1,@2,@3,@4];
for(id num in testArray){
NSLog(@"%@",num);
}
要注意的是使用for in快速枚舉NSMutableArray這類可變對象時要注意不能對容器進行修改,否則會導(dǎo)致遍歷器拋出異常導(dǎo)致程序崩潰。
二.性能測試
我們這里用命令行運行這段代碼以排除任何干擾最終結(jié)果的隱藏在幕后的保留或者排除處理。
clang -framework Foundation main.m -o main
static const NSUInteger arrayItems = 10000000;
NSMutableArray *array = [NSMutableArray arrayWithCapacity:arrayItems];
for (int i = 0; i < arrayItems; i++) [array addObject:@(i)];
array = [array copy];
CFTimeInterval start = CFAbsoluteTimeGetCurrent();
// 常用的for循環(huán)
for (NSUInteger i = 0; i < [array count]; i++){
id object = array[i];
}
CFTimeInterval forLoop = CFAbsoluteTimeGetCurrent();
NSLog(@"For loop: %g", forLoop - start);
//優(yōu)化過的常用for循環(huán)
NSUInteger count = [array count];
for (NSUInteger i = 0; i < count; i++){
id object = array[i];
}
CFTimeInterval forLoopWithCountVar = CFAbsoluteTimeGetCurrent();
NSLog(@"Optimized for loop: %g", forLoopWithCountVar - forLoop);
CFTimeInterval enumeratorLoop = CFAbsoluteTimeGetCurrent();
// 快速枚舉
for (id object in array){
}
CFTimeInterval forInLoop = CFAbsoluteTimeGetCurrent();
NSLog(@"For…in loop: %g", forInLoop - enumeratorLoop);
}
運行結(jié)果如下:

由此可以看出for in的性能最高,優(yōu)化了的普通循環(huán)也要比正常的快很多?;谖覀兯?,如果所有其它的因素都一樣的話,在循環(huán)遍歷數(shù)組時你應(yīng)該嘗試去使用for...in循環(huán)。至于 NSSet 和 NSDictionary,也可以測試一下,結(jié)果是一樣的。