項目中的問題

控制臺的Log:Terminating app due to uncaught exception ‘NSGenericException’, reason: ‘*** Collection <__NSArrayM: 0x2811ebed0> was mutated while being enumerated.’

一、原因:

1、某個數(shù)組在遍歷的時候,同時又在修改數(shù)組中的內(nèi)容,才導(dǎo)致的崩潰。
2、for in 方法的原理是根據(jù) enumerator對象內(nèi)部的計數(shù)器,調(diào)用nextObject方法來實現(xiàn)返回下一個數(shù)組元素的,知道元素全部返回就會返回nil,這就代表著整個enumerator對象就遍歷完成了。需要注意的是以這種原理來遍歷enumrator對象的話, 無論對這個對象做什么操作, 對象的計數(shù)器都不會被重置!

二、解決方案:

方案一:新創(chuàng)建一個臨時的數(shù)組,將原始數(shù)組的數(shù)據(jù)拷貝到新的臨時數(shù)組;代碼如下:

NSMutableArray  *dataArray = xxx; 
NSArray  *tmpArr = [NSArray arrayWithArray: dataArray];  
for (NSDictionary *dic in tmpArr) {        
    if (condition){            
         [dataArray removeObject:dic];
    }      
 }

方案二:使用帶有block的數(shù)組NSArray/NSMutableArray的系統(tǒng)API,找到符合條件的時候,暫停遍歷,對數(shù)組的內(nèi)容進(jìn)行修改。代碼如下:

NSMutableArray  *dataArray = xxx; 
dataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    if (condition) {
        *stop = YES;
        if (*stop == YES) {
            [dataArray replaceObjectAtIndex:idx withObject:@"ooo"];
        }
    }
}

參考的文章:
http://www.itdecent.cn/p/1a3065a07cbc
http://www.itdecent.cn/p/c2678ff90e46

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

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容