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;
}
}];