for in 快速枚举

突然研究了下for循环和for in 的区别,之前一直觉得这两者是相同的。

for in实际上是快速枚举,跟for循环意义上还是有区别的。你去研究一下枚举。

oc的for in 快速枚举遍历的时候是按照元素在容器内的顺序(NSArray中元素的顺序是你添加的顺序,NSSet和NSDictionry中元素的顺序是按照底层算法进行排序的与你添加的顺序不同)进行枚举的。

要注意的是使用for in快速枚举NSMutableArray这类可变对象时要注意不能对容器进行修改,否则会导致遍历器抛出异常导致程序崩溃。

这是因为用for循环机器不能自己察觉,但是枚举器可以察觉。

实际使用中却不是那么回事,如果在for in 循环里,对这个数组进行了修改的话,无论是增,删,修改数组元素位置,都会扔一个异常出来,错误是被遍历的数组已被销毁(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.),比如以下代码:

NSMutableArray* arr = [NSMutableArray arrayWithObjects:@"1",@"2",@"3", nil];

for (NSString* str in arr) {

        if ([str isEqualToString:@"1"] || [str isEqualToString:@"5"]) {

            [arr addObject:@"4"]; //或者  [arr removeObject:@"1"]; 或者 [arr exchangeObjectAtIndex:0 withObjectAtIndex:2];

            continue;

        }


    }

如果你这么做了,枚举器会很困惑,而你将得到未定义的结果。

这个错误(<__NSArrayM: 0xa4fc000> was mutated while being enumerated.)的意思是:枚举的过程中数组发生了突变

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值