for遍历、for in遍历、enumerateObjectsU

2017-06-21  本文已影响66人  小屋新

废话少说,开门见山!


遍历常用的基本上有for 、 for in 、enumerateObjectsUsingBlock,先上代码:
1、先用for循环创建一个数组

NSMutableArray *muArr = [[NSMutableArray alloc] init];
    for (int i = 0 ; i < 10; i ++) {
        [muArr addObject:[NSString stringWithFormat:@"%d",i]];
    }

用for循环进行遍历(看起来和上面创建数组有点相似,但又不同),我们在循环里加了一个条件,当i==6的时候,在muArr里面加入一个字符串,此时是完全没问题的

for (int i = 0; i < muArr.count; i ++) {
        NSString *content = [muArr objectAtIndex:i];
        NSLog(@"%@",content);
        
        if (i == 6) {
            [muArr addObject:@"cj"];
        }
    }

现在我们用for in来进行遍历,然后根据条件改变muArr的原有的数据,此时就会出现崩溃

for (NSString *str in muArr) {
        if ([str isEqualToString:@"6"]) {
            [muArr addObject:@"Annie"];
        }
    }

崩溃内容如下:

 *** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x61000004e5e0> was mutated while being enumerated.'

是不是有些纳闷,怎么会崩溃呢,看到错误信息没有,这个数组是个枚举类型的,就是说,for in 遍历是快速枚举,我们不能在这个方法里面对数组进行增、删、改。NSArray的枚举操作中有一条是需要注意:对于可变数组进行枚举操作时,不能通过添加或删除对象等这类操作来改变数组容器,否则就会报错。

数组还有一个系统自带的方法 enumerateObjectsUsingBlock: 遍历,代码如下,这个方法也是简单的遍历,不能对数组容器进行改变的操作

[muArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if (idx == 6) {
            *stop = YES;
        }
    }];

顺便赠送一个字典的遍历:

NSDictionary *dic = @{
                          @"1":@"cj",
                          @"2":@"annie"
                          };
    [dic enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        if ([key isEqualToString:@"1"]) {
            *stop = YES;
        }
    }];
上一篇下一篇

猜你喜欢

热点阅读