iOS關(guān)于使用for in循環(huán)刪除數(shù)組元素報(bào)錯(cuò)深入分析

下面這段碼在運(yùn)行的時(shí)候是崩潰的

for (UIButton * btn in _selectionBtnsArr) {
    if (btn.tag == button.tag) {
        [_selectionBtnsArr removeObject:btn];
    }
}

因?yàn)?code>for in語法在執(zhí)行循環(huán)的時(shí)候是遍歷整個(gè)數(shù)組的元素,此時(shí)我們是不可以刪除數(shù)組中的元素的,當(dāng)遍歷到我們刪除的元素,而元素不存在就會(huì)崩潰。

但當(dāng)我們的數(shù)組中只有一個(gè)元素是不會(huì)報(bào)錯(cuò)的,因?yàn)楫?dāng)我們要?jiǎng)h除這個(gè)元素的時(shí)候for in語法的遍歷工作已經(jīng)完成,此時(shí)再修改數(shù)組中的元素則沒有影響,也就是說for in語法執(zhí)行循環(huán)的期間數(shù)組是不可以刪除元素的。同樣,當(dāng)我們刪除的是數(shù)組的最后的一個(gè)元素肯定也是可以的,因?yàn)樵趧h除數(shù)組的最后一個(gè)元素的時(shí)候,for in的遍歷工作已經(jīng)完成了。

解決辦法:??錯(cuò)誤:有的朋友在評(píng)論區(qū)提出這種方法是不正確的。確實(shí)是這樣,當(dāng)我們刪除數(shù)組中的一個(gè)元素的時(shí)候,數(shù)組中元素的下標(biāo)已經(jīng)發(fā)生了變化,這時(shí)依然按照循環(huán)的順序進(jìn)行遍歷會(huì)漏掉一些元素,所以下面??這種做法是不正確的!

?? for (int i = 0; i < _selectionBtnsArr.count; i++) {
??     UIButton * btn = _selectionBtnsArr[i];
??     if (btn.tag == button.tag) {
??         [_selectionBtnsArr removeObject:btn];
??     }
?? }

修正后的解決辦法

for (int i = 0; i < _selectionBtnsArr.count; i++) {
    UIButton * btn = _selectionBtnsArr[i];
    if (btn.tag == button.tag) {
        [_selectionBtnsArr removeObject:btn];
        i--; // 當(dāng)有元素被刪除的時(shí)候i的值回退1,從而抵消因刪除元素而導(dǎo)致的元素下標(biāo)位移的變化
    }
}

大家有沒有更好的方法呢?歡迎前來探討

版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 ,轉(zhuǎn)載時(shí)必須注明出處及相應(yīng)鏈接!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容