使用SDWebImage加載大量圖片后造成內存泄露的解決辦法


轉自 http://www.cnblogs.com/ziip/p/4664234.html

 

SDWebImage的知名度就不用說了,github上近10k的star,國內外太多的App使用其進行圖片加載。

但是最近在使用過程中發現,在UITableView中不斷加載更多的內容,使用SDWebImage會造成內存占用越來越大,導致memory warning最終terminate,稍微找了下問題原因,發現不少開發者都遇到過這個問題,中文的資料沒有搜到該問題的解決辦法,為了方便國內其他開發者遇到類似問題不浪費時間,這篇blog把解決方法記錄如下:

首先檢查了SDWebImage代碼中對於memory warning的處理:

- (void)clearMemory {
    [self.memCache removeAllObjects];
}

其中self.memCache是NSCache類型的,可以看到SDWebImage本身對內存警告執行了操作,但是並沒有什么X用。

用Instruments的allocations分析了一下內存使用情況:

 

可以看到內存基本都在decodedImageWithImage:這個方法里被占用了,查看了這個方法的內部實現,感覺還是比較正常的,只好求助google

最后在github上找到了這條issue:https://github.com/rs/SDWebImage/issues/538

下面回復很多(看來這個問題很多人都遇到了),甚至SDWebImage的作者本人rs也在下面進行了很多的回復(雖然他的回復並沒有什么X用),回復里說到的問題原因和解決辦法歸納如下:

1.rs本人回復的:SDWebImage用到的NSCache會在合適的時候(memory warning)釋放內存,很多應用在加載大量圖片的時候沒有出現這種情況;

2.這個問題是因為SDWebImage對GIF的支持的代碼造成的,去掉相關代碼即可;

3.decodedImageWithImage的實現直接retrun image即可;

4.https://twitter.com/0xced/status/332252283758845953,這條Twitter也是蠻幽默的,通俗的翻譯就是這條Twitter中描述的解決辦法拯救了那些因為SDWebImage導致問題的程序員於水火之中。

 

挨個試了試上面4中解決方法:

第一種沒什么可說的了,之前分析源碼的時候就已經看到,也就是說rs的解決辦法沒用。

第二種辦法,閱讀源碼可以發現SDWebImage中對GIF的處理只會針對GIF圖片,並不會影響到png或者其他格式的圖片,因此這個辦法我覺得沒用,沒有嘗試。

第三種,直接導致內存占用原因由CG raster data變成了ImageIO_PNG_Data,也是沒用。

第四種,最開始我在receive memory warning的時候調用了這段代碼

            [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];

發現依然會出現問題,遂嘗試了每次加載更多內容的時候都執行一次,終於內存不再持續增加了,也就是說第四種是最終的解決辦法,在后續blog我可能會專門分析一下這個問題出現的原因和解決的原理。

總結如下:

在使用SDWebImage加載較多圖片造成內存警告時,定期調用

 [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];

可解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM