was mutated while being enumerated, 如何解決For...in... ??中出現的報錯?

was mutated while being enumerated, 如何解決For...in... ??中出現的報錯?

這個報錯,顧名思義 "在枚舉的時候發生了變化"
for...in...利用了快速枚舉NSFastEnumerate
當我們想要改變數組變量中的數據或者刪除數組中的數據的時候,不能用for...in...

應該是Objective-C中的foreach循環與Java中的相似,在內部是用iterator(迭代器)實現遍歷的。而不管是在Java還是C++中,一旦修改了被遍歷對象,在修改前生成的iterator都會失效,所以《C++ Primer》及Java課本中曾警告過不要在用iterator遍歷集合時增刪集合元素,看來Objective-C中也是一樣。

NSArray的枚舉操作中有一條需要注意:對于可變數組進行枚舉操作時,你不能通過添加或刪除對象這類操作來改變數組容器。如果你這么做了,枚舉器會很困惑,而你將得到未定義的結果。

所以我這里給出三種解決方案

1.利用for loop ()

 for (int i = 0; i < arr.count; i++) {
            if (...) {
                // do sth ;
            }
        }

2.利用臨時變量

   NSArray *tmp = [NSArray arrayWithArray:arr];
        for (id obj in tmp) {
            if (...) {
               // do sth ;
            }
        }

3.enumerateObjectsUsingBlock(推薦)

   [arr enumerateObjectsUsingBlock:^(NSMutableDictionary *obj, NSUInteger idx, BOOL *stop) {
            if (...) {
                // do sth
                *stop = YES; // 相當于break ; stop控制跳出枚舉器.
            }
        }];

出自 was mutated while being enumerated 你是不是以為你真的懂For...in... ??

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,776評論 0 33
  • 支持原創,如需轉載, 請注明出處你是不是以為你真的懂For...in... ??哈哈哈哈, 我也碰到了這個報錯 ....
    TEASON閱讀 11,709評論 8 19
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,769評論 18 399
  • 我們已經不是小孩子了,人生有些路需要我們自己咬牙堅持的走完,值得慶幸的是別人也要同我們一樣體驗,我們已經長大了,不...
    閑37閱讀 248評論 0 0
  • 莉香在一家小公司上班,第二份工作。每天下班回家,地鐵里都擠滿各樣的人:穿鉚釘靴梳大背頭的年輕男子,妝容精致的女生,...
    大蔥zan醬閱讀 249評論 0 0