for-in遍歷數(shù)組時(shí)進(jìn)行刪除操作的幾種方式

for-in 方式在遍歷數(shù)據(jù)源開(kāi)始時(shí),數(shù)據(jù)源的個(gè)數(shù)就已經(jīng)確定,在遍歷時(shí)修改數(shù)據(jù)源并不會(huì)改變開(kāi)始時(shí)確定下來(lái)的數(shù)據(jù)源個(gè)數(shù).所以在for-in 循環(huán)內(nèi)刪除數(shù)據(jù)源數(shù)據(jù)經(jīng)常會(huì)造成程序 crash. 下面是總結(jié)的一些遍歷刪除數(shù)據(jù)源數(shù)據(jù)的幾種方式:

NSMutableArray *origArr = [NSMutableArray arrayWithObjects:@"1",@"5",@"6",
                                                           @"1",@"2",@"8",
                                                           @"1",@"5",@"7",
                                                           nil];

先來(lái)看一下錯(cuò)誤的方式:
報(bào)錯(cuò)原因:*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <__NSArrayM: 0x100400e10> was mutated while being enumerated.'

for (NSString *str in origArr) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }

下面是幾種可行方案:

//方式一:采用 for循環(huán)
        for (int i = 0; i < origArr.count; i++) {
            NSString *str = [origArr objectAtIndex:i];
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }
//方式二:采用 for-in, 添加 break 語(yǔ)句
        for (NSString *str in origArr) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
                break;
            }
        }
//方式三:新建一個(gè)副本數(shù)據(jù)源,遍歷副本數(shù)據(jù)源,然后在原數(shù)據(jù)源內(nèi)刪除數(shù)據(jù)
        NSMutableArray *copyArr = [NSMutableArray arrayWithArray:origArr];
        for (NSString *str in copyArr) {
            if ([str isEqualToString:@"1"]) {
                //在原數(shù)據(jù)源內(nèi)刪除數(shù)據(jù)
                [origArr removeObject:str];
            }
        }
//方式四:逆序遍歷,然后刪除數(shù)據(jù)
        NSEnumerator *enumeretor = [origArr reverseObjectEnumerator];
        for (NSString *str in enumeretor) {
            if ([str isEqualToString:@"1"]) {
                [origArr removeObject:str];
            }
        }

--- END ---

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

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

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