下面這段碼在運(yùn)行的時候是崩潰的
for (UIButton * btn in _selectionBtnsArr) {
if (btn.tag == button.tag) {
[_selectionBtnsArr removeObject:btn];
}
}
因?yàn)?code>for in語法在執(zhí)行循環(huán)的時候是遍歷整個數(shù)組的元素,此時我們是不可以刪除數(shù)組中的元素的,當(dāng)遍歷到我們刪除的元素壶笼,而元素不存在就會崩潰虐沥。
但當(dāng)我們的數(shù)組中只有一個元素是不會報錯的,因?yàn)楫?dāng)我們要刪除這個元素的時候for in
語法的遍歷工作已經(jīng)完成脏榆,此時再修改數(shù)組中的元素則沒有影響猖毫,也就是說在for in
語法執(zhí)行循環(huán)的期間數(shù)組是不可以刪除元素的。同樣须喂,當(dāng)我們刪除的是數(shù)組的最后的一個元素肯定也是可以的吁断,因?yàn)樵趧h除數(shù)組的最后一個元素的時候,for in
的遍歷工作已經(jīng)完成了坞生。
解決辦法:??錯誤:有的朋友在評論區(qū)提出這種方法是不正確的仔役。確實(shí)是這樣,當(dāng)我們刪除數(shù)組中的一個元素的時候是己,數(shù)組中元素的下標(biāo)已經(jīng)發(fā)生了變化又兵,這時依然按照循環(huán)的順序進(jìn)行遍歷會漏掉一些元素,所以下面??這種做法是不正確的!
?? 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)有元素被刪除的時候i的值回退1沛厨,從而抵消因刪除元素而導(dǎo)致的元素下標(biāo)位移的變化
}
}
大家有沒有更好的方法呢宙地?歡迎前來探討
版權(quán)聲明:出自MajorLMJ技術(shù)博客的原創(chuàng)作品 ,轉(zhuǎn)載時必須注明出處及相應(yīng)鏈接逆皮!