多線程中不同線程同時(shí)操作一個(gè)數(shù)組

之前在調(diào)試跨層傳值的問題時(shí)發(fā)現(xiàn)一個(gè)很奇怪的問題:請求數(shù)據(jù)完成后的block會回調(diào)兩次。苦思冥想了好久都沒有理解為什么。C控制器中block回調(diào)中的代理方法會調(diào)用B控制器中的代理方法,B控制器中的代理方法會調(diào)用A控制器中的代理方法。

這是在C控制器

   [XJHttpTool PUT:url dictParameters:params success:^(id responseObject) {
        if ([[responseObject objectForKey:@"success"] integerValue]==1) {
            NSDictionary *dic = [responseObject objectForKey:@"kanban"];
            BoardModel *boardModle =[BoardModel objectWithKeyValues:dic];
            if ([self.delegate respondsToSelector:@selector(didChangeBoardInfo:andChangedStar:)]) {
                [self.delegate didChangeBoardInfo:boardModle andChangedStar:self.changedStar];
            }
        }else{
            [self alertUserWrongInfo:@"保存失敗!"];
        }
    } failure:^(NSError *error) {
        [self alertUserWrongInfo:@"保存失敗!"];
    }];

直到今天早上再次調(diào)試的時(shí)候,發(fā)現(xiàn)控制臺輸出了這個(gè)信息:

      'NSGenericException', reason: '*** Collection <__NSArrayM: 0x8ef350> was mutated while being enumerated.')

然后我就明白了。這個(gè)錯(cuò)誤的意思是如果對數(shù)組枚舉的時(shí)候不能同時(shí)對其進(jìn)行元素的刪除操作。

這是在上文block回調(diào)后A控制器中調(diào)用的代理方法

   for (NSArray *arr in self.boardArrayM) {
    if (arr.count == 0) {
        [self.boardArrayM removeObject:arr];
     }
   }

解決方法1:定義一個(gè)一模一樣的數(shù)組,遍歷數(shù)組A然后操作數(shù)組B。

    NSMutableArray *arrM = [NSMutableArray arrayWithArray:self.boardArrayM];
     for (NSArray *arr in arrM) {
      if (arr.count == 0) {
         [self.boardArrayM removeObject:arr];
      }
    }

解決方法2:使用for(;;)循環(huán)。而不是for in枚舉遍歷。

解決了這個(gè)問題后,我發(fā)現(xiàn)block的回調(diào)正常了,只調(diào)用一次。雖然我不明白為什么多個(gè)線程操作同一個(gè)數(shù)組引起問題與這個(gè)有什么聯(lián)系(是線程調(diào)度紊亂?),但問題確實(shí)是解決了。如果有明白的希望能留言告訴我,謝謝!

而且dealloc測試后發(fā)現(xiàn)沒有修改前,頁面跳轉(zhuǎn)到B控制器中時(shí),C控制器是沒有銷毀的,頁面跳轉(zhuǎn)到A控制器時(shí),C控制器也沒有銷毀,所以C中的方法可以再次被線程調(diào)用(怎么就調(diào)用了?不懂,有大牛請指點(diǎn)!),按理說導(dǎo)航控制器的子控制器出棧時(shí)應(yīng)當(dāng)銷毀的,而在做了修改后,頁面跳轉(zhuǎn)到B控制器時(shí),C控制器是銷毀的,這個(gè)是正常的,銷毀了當(dāng)然方法就不可能會被再次調(diào)用了。

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

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

  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,367評論 11 349
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,211評論 30 472
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,947評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,766評論 18 399
  • 備注:在阿里校招面試中遇到的問題 CPU 限制的應(yīng)用程序 CPU 限制的應(yīng)用程序,線程池的大小應(yīng)該等于系統(tǒng)里面 C...
    即墨燈火閱讀 319評論 0 0