公司的一個電商項目,很多商品展示頁,tableView、collectionView都有用到,少不了的就是加載圖片,現(xiàn)在主流的加載圖片的開源庫,我想大家都用到SDWebImage。
昨天測試又發(fā)現(xiàn)一個Bug,持續(xù)使用App幾分鐘后,App閃退,Bugly也沒有記錄下崩潰的原因,在錄制了視頻之后發(fā)現(xiàn),頁面來回切換用不了多久就閃退。
首先考慮到的是控制器是不是沒有銷毀造成的內(nèi)存泄漏。
然后真機連線測試,各種內(nèi)存監(jiān)測,一頓操作,一氣呵成,perfect。

測試過后發(fā)現(xiàn)控制器是正常銷毀的,卻發(fā)現(xiàn)造成閃退的真正元兇,是突如其來的內(nèi)存暴漲。
看似平靜的列表,卻在滑動之后,內(nèi)存暴增200MB,而且不會被釋放,難受。
隨后又發(fā)現(xiàn),下載已經(jīng)存在在Cache中的圖片是內(nèi)存變化不大,但是下載新圖片內(nèi)存就會發(fā)生變化,同時下載任務(wù)不多時,問題也不大,要是同時下載一二十張圖片問題就來了,內(nèi)存不斷累加,至此,確定是圖片下載造成的問題。
百度Google一頓搜,基本操作。
一大堆標題黨,什么是下載分辨率高的圖引起的,什么不一定是下載大圖引起,分辨率高的圖能不大?唉看到這些標題黨我真的難受,關(guān)鍵是我還信了你們,讓我更難受,讓我和同事賭上了我的所有家當(一瓶水),我打賭肯定是后臺上傳的圖片大引起的,結(jié)果模擬器沙盒一頓測試,輸了,輸?shù)媚敲磸氐?,圖片不大,一張圖平均30K左右。
好了好了回正題,不吹比了,這里就是告訴大家一個解決問題的思路,從多方面去發(fā)現(xiàn)問題的本質(zhì),不喜勿噴。
在監(jiān)測內(nèi)存暴漲的同時,使用App內(nèi)的清理緩存功能,意外的發(fā)現(xiàn),清理Cache中的文件之后,暴增的內(nèi)存全部釋放掉了。中途也用了很多帖子中推薦的方法,試過但沒派上用場,網(wǎng)上的方法就是壓縮圖片的方式來解決問題,我想也只有在下載大圖或者分辨率高的圖片時才用得上。
最后說下我的解決方法吧,也是來自網(wǎng)上的帖子里的方法但是是我自己總結(jié)的,也有我自己的一些看法。我這里只在圖片加載完成后添加了一段代碼。
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
此時內(nèi)存依舊暴漲,但在控制器銷毀時,暴漲的內(nèi)存會跟隨控制器一起釋放。
我看網(wǎng)上的帖子說在下載大圖時,這個方法不是很好用,那當我們都是大圖的時候我們該怎么解決呢,先壓縮再配合這個方法使用。
不過這里不建議去改SDWebImage的實現(xiàn)方法,End。