Mutable對(duì)象的線程安全問(wèn)題

用for循環(huán)遍歷了可變對(duì)象,同時(shí)對(duì)可變對(duì)象進(jìn)行增加、刪除操作會(huì)報(bào)此錯(cuò)誤:
  • reason: Collection <__NSArrayM: 0x60800005bd50> was mutated while being enumerated
解決辦法:

① 操作完成立刻跳出循環(huán)

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"1", @"2", @"3", @"4", @"5" , nil];
    for (NSString *str in array) {
        if ([str isEqualToString:@"2"]) {
            [array removeObject:@"0"];
            break;
        }
    }
注意:用 continue 跳出還是會(huì)報(bào)錯(cuò),必須結(jié)束循環(huán)

② 遍歷copy后的對(duì)象

for (NSString *str in [array copy]) {
        if ([str isEqualToString:@"2"]) {
            [array addObject:@"0"];
        }
    }

③ 開(kāi)線程去執(zhí)行操作

for (NSString *str in array) {
        if ([str isEqualToString:@"2"]) {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                [array addObject:@"0"];
            });
        }
    }

④ 更換遍歷方式

[array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj isEqualToString:@"2"]) {
            [array removeObject:obj];
//            *stop = true;
        }
    }];
話題延伸:
@property (atomic, strong)NSMutableArray *array;
原子屬性修飾的對(duì)象是安全的,那么以上屬性是安全的嗎?

面試中可能會(huì)遇到這樣的問(wèn)題,atomic修飾只是說(shuō)此對(duì)象setter & getter 方法是安全的,對(duì)象本身并不是安全的;

@property (nonatomic, copy)NSMutableArray *array;
對(duì)這個(gè)數(shù)組進(jìn)行增加、刪除操作會(huì)報(bào)錯(cuò)嗎?

會(huì), 打印對(duì)象的類型就看到了:

@property (nonatomic, copy)NSMutableArray *array1;
@property (nonatomic, strong)NSMutableArray *array2;

NSLog(@"%@, ", [self.array1 class]);
NSLog(@"%@, ", [self.array2 class]);

2016-11-14 17:55:15.053 TestArray[26252:1532398] __NSArrayI, 
2016-11-14 17:55:15.055 TestArray[26252:1532398] __NSArrayM, 

沒(méi)有經(jīng)過(guò)copy修飾的是Mutable類型,經(jīng)過(guò)copy修飾的是Immutable類型

以上代碼均經(jīng)過(guò)測(cè)試,如有不妥的地方希望指正!

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Copy & MutableCopy 前言 好久都沒(méi)寫東西了,除了平常的工作、學(xué)習(xí),過(guò)年的喜慶與忙碌....都是借...
    Chrisss閱讀 1,103評(píng)論 4 2
  • Java 語(yǔ)言支持的類型分為兩類:基本類型和引用類型。整型(byte 1, short 2, int 4, lon...
    xiaogmail閱讀 1,444評(píng)論 0 10
  • 絕圣棄智,民利百倍;絕仁棄義,民復(fù)孝慈;絕巧棄利,盜賊有。此三者以為文不足,故令有所屬。見(jiàn)素抱樸,少私寡欲,絕...
    冰火兩重天1116閱讀 250評(píng)論 0 1
  • 風(fēng) 淚吻了 街道,跑的很遠(yuǎn)。 街道 欲將 風(fēng) 挽留,風(fēng) 卻離開(kāi)了視線。 對(duì)于 街道 ,風(fēng) 只是暫住秒針微顫的一點(diǎn) ...
    孔慕燦閱讀 416評(píng)論 0 0
  • 轉(zhuǎn)自Python中文開(kāi)發(fā)者社區(qū) yield的英文單詞意思是生產(chǎn),剛接觸Python的時(shí)候感到非常困惑,一直沒(méi)弄明白...
    LazzMan閱讀 930評(píng)論 0 1

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