遇到一個(gè)問(wèn)題,跟蹤了半天才發(fā)現(xiàn)原因糙俗。(現(xiàn)象是勒奇,客戶(hù)老是說(shuō)在下載的過(guò)程中,過(guò)一會(huì)就出現(xiàn)崩潰的現(xiàn)象, 只要點(diǎn)了下載按鈕, 不做任何操作, 然后期刊就開(kāi)始正常下載了,過(guò)大概5分鐘后奠衔,再去看,程序就已經(jīng)崩潰了)
在做《時(shí)裝傳媒》ipad應(yīng)用時(shí)张弛,首頁(yè)的下載頁(yè)面鹃两,下載時(shí),會(huì)不斷地去更新頁(yè)面上的下載進(jìn)度驶兜,同時(shí)還有一個(gè)15秒的timer, 會(huì)每15秒切換當(dāng)前顯示的是男裝扼仲,女裝或者藝術(shù)刊頁(yè)面。這個(gè)timer會(huì)把當(dāng)前的scrollView中顯示的封面圖片進(jìn)行移除抄淑,然后再替換屠凶,以實(shí)現(xiàn)自動(dòng)更換首頁(yè)封面的功能
崩潰時(shí)提示:
Collection was mutated while being enumerated
(在網(wǎng)上搜了一下,發(fā)現(xiàn)有一個(gè)類(lèi)似的問(wèn)題:'NSGenericException', reason: '*** Collection <__NSArrayM: 0x8ef350> was mutated while being enumerated.')
根據(jù)這個(gè)提示肆资, 想了一下矗愧,覺(jué)得應(yīng)該在做遍歷的過(guò)程中,修改了這個(gè)NSArray或者是NSMutableArray郑原。后來(lái)想想唉韭, 這可能是多線(xiàn)程并發(fā)訪(fǎng)問(wèn)時(shí)出現(xiàn)的問(wèn)題, 沿崩潰時(shí)的堆棧找了一下犯犁,果然找到属愤。
因?yàn)槲覀冊(cè)谙螺d時(shí), 使用了Block每當(dāng)接受到數(shù)據(jù)酸役,就去更新一下一個(gè)UIScrollView中的下載進(jìn)度條的百分比住诸。
而另有一個(gè)NSTimer, 會(huì)隔一段時(shí)間把這個(gè)UIScrollView中的全部元素清空涣澡,然后再重新添加贱呐, 因?yàn)榭赡苡袆?dòng)態(tài)的元素需要添加或者刪除。
運(yùn)行時(shí)入桂, 就會(huì)出現(xiàn)奄薇,兩個(gè)線(xiàn)程同時(shí)去訪(fǎng)問(wèn)的情況, 當(dāng)Block正在去更新UIScrollView中的這個(gè)元素時(shí)事格, NSTimer中可能正在執(zhí)行清除操作惕艳,所以就崩了搞隐。
原來(lái),在同一時(shí)間远搪,不同的線(xiàn)程同時(shí)讀取和修改了NSMutaleArray劣纲。
解決辦法:避免多線(xiàn)程同時(shí)去修改一個(gè)對(duì)象, 避免做遍歷時(shí)谁鳍,這個(gè)對(duì)象被修改癞季,根據(jù)這個(gè)思想,可以考慮加鎖倘潜,或者直接使用atomic的方式來(lái)做绷柒。