本帖最后由 kailee 于 2015-5-19 16:41 编辑
(一)楼主提到的第二种方法是快速遍历:
1.obj代表着数组中的每一个元素(id类型)
2.数组中的每一个元素拿出来赋值给obj,赋值一次调用一次循环体
- for (id obj in array)
- {
- // 找出obj在数组中的位置,i记录位置
- NSUInterger i = [array indexOfObject:obj];
- NSLog(@"%ld-%@", i, obj);
- }
复制代码
(二)第三种方式调用Array的enumerateObjectsUsingBlock方法分析:
1.每拿到一个元素就调用一次block,就是把元素传递给block
2.每遍历到一个元素,就会调用一次block
3.并且当前元素和索引位置当做参数传递给block
4.BOOL *stop 用来停止遍历,
- [array enumerateObjectsUsingBlock:^(id obj, NSUInterger idx, BOOL *stop)
- {
- NSLog(@"%ld-%@", idx, obj);
- // 遍历到1就退出循环
- if (idx == 1)
- {
- // 遍历停止
- *stop = YES;
- }
- }];
复制代码
5.block遍历的本质:
- void ^(myblock)(id, NSUInterger, BOOL *) = ^(id obj, NSUInterger idx, BOOL *stop)
- {
- NSLog(@"%ld-%@", idx, obj);
- if (idx == 1)
- {
- // 遍历停止
- *stop = YES;
- }
- };
- for (int i = 0; i < array.conut; i++)
- {
- // 用来标记是否需要停止遍历
- BOOL isStop = NO;
- // 取出元素
- id obj = array;
- // 把BOOL的地址传递给myblock,否则就变成了“值传递”,那么
- // myblock就无法改变BOOL的值,那么for里边BOOL的值一直就是NO无法修改
- myblock(obj, i, &isStop);
- if (isStop)
- {
- break;
- }
- }
复制代码
|