iOS 使用Forin 遍歷數組并刪除元素時 crash

今天修改數組里面的無效值時,使用了 for in 循環(huán), 沒想到竟然crash了. 當時我就無措了.代碼如下

for( customModel *model  in  M_array ){
  if ([model.name isEqualToString:@"***"]){
      [M_array removeObject:model];
  }
}

crash 原因: <_NSArrayM : >was mutated while being enumerated

為什么會造成crash呢?
因為快速遍歷的原理是根據 enumerator對象內部的計數器,調用nextObject方法來實現(xiàn)返回下一個數組元素的. 知道元素全部返回就會返回nil,這就代表著整個enumerator對象就遍歷完成了
#需要注意的是以這種原理來遍歷enumerator對象的話, 無論對這個對象做什么操作, 對象的計數器都不會被重置!
找到的解決方法有以下幾種:

  • 1使用for循環(huán)遍歷
for (int i= 0; i < M_array.count;i++){
    customModel *model  = M_array[i];
    if([model.name isEqualToString:@"***"])
    {
        [M_array removeObject:model];
    }
}
  • 2如果還想使用for-in 來遍歷的話也是可以的.
NSMutableArray *M_arrayCopy = [M_array mutableCopy];
for( customModel *model  in  M_arrayCopy ){
      if ([model.name isEqualToString:@"***"])
      {
      [M_array removeObject:model];
      }
}
  • 3 對數組逆序遍歷,查找對應的元素刪除
  NSEnumerator *enumerator = [M_array reverseObjectEnumerator];
  for( customModel *model  in  enumerator ){
      if ([model.name isEqualToString:@"***"])
      {
           [M_array removeObject:model];
      }
}
  • 4 使用
    - (void)enumerateObjectsUsingBlock:(void (^)(ObjectType obj, NSUInteger idx, BOOL *stop))block;
[M_array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                                        
                                       customModel *model = M_array[idx];
                                        if ([model.name isEqualToString:@"***"]) {
                                            [M_array removeObject:model];
                                        }
                                    }];

如有該文章有什么問題請留言或者私信我.謝謝!

參考:
官方文檔:
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSEnumerator_Class/index.html
開發(fā)者博客:
http://www.itdecent.cn/p/a634310774a9
http://blog.csdn.net/zhangzhan_zg/article/details/38453305

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容