今天在无意中看到MBProgressHUD源码解析中有这么一段代码:
+ (MB_INSTANCETYPE)HUDForView:(UIView *)view {
NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator];
for (UIView *subview in subviewsEnum) {
if ([subview isKindOfClass:self]) { return (MBProgressHUD *)subview; } }
return nil;}
我感觉对NSEnumerator算是比较陌生吧,然后查了一下,应该算是效能较高的一种遍历NSArray的方式,直接测试了一下,由于简单测试功能,速度方面感觉无明显效果.
NSMutableArray<NSString *>* arr = [NSMutableArray array];
arr[0] = @"0";
arr[1] = @"1";
arr[2] = @"2";
arr[3] = @"3";
arr[4] = @"4";
NSEnumerator* arrEnum = [arr objectEnumerator];
id object;
while (object = [arrEnum nextObject]) {
NSLog(object);
操作
}
实际上,调用了objectEnumerator方法的时候,返回的是一个id类型的object,有时候在编译阶段还不知道具体是什么类的话,可以直接打印尝试一下,使用nextObject这个方法可以得到一个指针,要注意的是 使用这种方式遍历 遍历过程中不可以对数组进行增删操作 否则将会出现一些未知的错误
另外,我们最常用的循环方式还有
- 使用for循环加 count 方法遍历
int i = 0;for(i = 0; i < [array count]; i++){
[array objectAtIndex:i]
操作
} - 使用for in方式遍历
for(NSString *str in array){
操作
}
另外:其实这个感觉跟Java中的类的遍历非常相似:
- Java中三种迭代是否能删除(由于本人正在学习Java,随便复习一下):
- 普通for循环,可以删除,但是索引要--
- 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
- 增强for循环不能删除
网友评论