iOS 遍历数组删除元素

下面,我们写一段代码进行测试:

//我们有一个可变数组
NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@1, @2, @3, @4, @5, @6, nil];

// 普通的循环遍历方式
for (NSUInteger i = 0; i < mArr.count; i++) {
   [mArr removeObjectAtIndex:i];
}
NSLog(@"%@", mArr);
//打印结果为:2, 4, 6,而且程序没有crash

// 使用迭代器遍历
[mArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
   [mArr removeObject:obj];
}];
NSLog(@"%@", mArr);
//打印结果为:2, 4, 6,而且程序没有crash

// 使用for-in遍历
for (NSNumber *obj in mArr) {
   [mArr removeObject:obj];
}
NSLog(@"%@", mArr);
// 程序crash,
// Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x6000002588d0> was mutated while being enumerated.'

所以在可变数组的遍历过程中,根据不同的遍历方式,会产生不同的问题。

那么,如果想在遍历过程中,删除数组的元素,该怎么处理呢
大众的做法是新建一个可变数组,把要想保留的元素,加入到新的数组,方法是可行的,有没有更好的解决方案呢?
答案是有的。采用逆序遍历

// 逆序遍历
[mArr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
   [mArr removeObject:obj];
}];

// 逆序遍历
for (NSNumber *obj in [mArr reverseObjectEnumerator]) {
   [mArr removeObject:obj];
}

这样,程序就不会crash,数组中的元素也成功移除了。
补充
在实际开发中,笔者建议要谨慎使用,要多加测试,笔者在使用分割字符串后,初始化一个可变数组进行删除操作就crash了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在之前的面试中,面试官问我一个项目中的问题:在可变数组的遍历过程中,删除其中的元素,会发生什么问题?我们都知道,在...
    luzsyn阅读 4,434评论 5 8
  • 今天在修改某项需求的时候,需要在遍历的时候将匹配项移除掉,采用的时forin的方式遍历,然后运行的时候却crash...
    ocarol阅读 4,506评论 8 13
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,172评论 1 32
  • 每次白天起床困难,总想着今晚早点睡,明天早点起床。只有早睡才能早起,事实上到了晚上早睡是不能的,晚睡到时可以的。 ...
    行百里者半九十阅读 303评论 0 0
  • 萧红微胖体宽 胯大 还不会穿衣服 这些可从鲁迅对萧红穿衣一段评价可知 可就是这样一个称不上美人的女人 汪恩甲 萧军...
    皮皮肥阅读 215评论 0 0