多線(xiàn)程寫(xiě)讀寫(xiě)字典引起的crash

一個(gè)偶現(xiàn)的Bug,并且只在iOS11發(fā)布后才出來(lái)的。

場(chǎng)景

場(chǎng)景比較簡(jiǎn)單:使用一個(gè)單例做緩存。單例中加了一個(gè)可變字典,用于緩存已經(jīng)加載過(guò)的圖片。

流程

根據(jù)圖片的名稱(chēng)從字典中查找圖片對(duì)象,當(dāng)找不到對(duì)象的時(shí)候就創(chuàng)建一個(gè)新的UIImage對(duì)象,并保存到字典中。找到對(duì)象就直接取現(xiàn)在有的緩存UIImage。

問(wèn)題

多線(xiàn)程時(shí),NSMutableDictionary取對(duì)象不是元子操作,所以,多個(gè)線(xiàn)程請(qǐng)求同一個(gè)圖片對(duì)象時(shí)都得到nil。然后就都跑去創(chuàng)建UIImage對(duì)象,并都試圖保存。創(chuàng)建UIImage對(duì)象時(shí),使用imageNamed方法,系統(tǒng)做了優(yōu)化,進(jìn)行緩存處理了。
NSMutableDictionary中添加相同的key的時(shí)候,會(huì)被原來(lái)的對(duì)象移除。第一個(gè)線(xiàn)程保存結(jié)束后,此時(shí)如果第二個(gè)線(xiàn)程試圖添加的對(duì)象正是第一個(gè)線(xiàn)程剛放進(jìn)去的對(duì)象,會(huì)出現(xiàn)這樣的流程:判斷字典中是否有key時(shí)成立,然后將對(duì)象移除,內(nèi)存回收,再往字典里寫(xiě)對(duì)象時(shí),就等于設(shè)置了一個(gè)野指針對(duì)象。

其它問(wèn)題

雖然聽(tīng)說(shuō)使用imageNamed,系統(tǒng)對(duì)自己做緩存,可之前試過(guò),對(duì)于同一張圖片,所創(chuàng)建的新UIImage對(duì)象的內(nèi)存地址都不一樣~所以,=。=

最后編輯于
?著作權(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)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一、深復(fù)制和淺復(fù)制的區(qū)別? 1、淺復(fù)制:只是復(fù)制了指向?qū)ο蟮闹羔?,即兩個(gè)指針指向同一塊內(nèi)存單元!而不復(fù)制指向?qū)ο蟮?..
    iOS_Alex閱讀 1,531評(píng)論 1 27
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,553評(píng)論 0 6
  • 1.自定義控件 a.繼承某個(gè)控件 b.重寫(xiě)initWithFrame方法可以設(shè)置一些它的屬性 c.在layouts...
    圍繞的城閱讀 3,704評(píng)論 2 4
  • 學(xué)習(xí)Android的同學(xué)注意了?。?! 學(xué)習(xí)過(guò)程中遇到什么問(wèn)題或者想獲取學(xué)習(xí)資源的話(huà),歡迎加入Android學(xué)習(xí)交流...
    kingZXY2009閱讀 412評(píng)論 0 0
  • 焦慮是一種很特別的情感——一種一定會(huì)被覺(jué)察到的情感。也就是說(shuō),也許你抑郁,但是你不知道你的這種負(fù)面情緒是什么;但只...
    斯坦威閱讀 377評(píng)論 0 0

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