下面這段碼在運(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)鏈接!