關于使用SDWebImage內存爆漲的問題

這幾天在做一個需求,需要在一系列的控制器里下載N張圖片。最方便最省事的解決方案當然首選SDWebImage這個框架(相信也很少不去用它的)。把圖片地址放進去,返回一個圖片,輕松,快捷,令人幸福,直到看到下面這個畫面。

屏幕快照 2016-07-14 下午4.56.39.png

什么鬼!內存竟然從20M給我彪到了180+M!而且當我把控制器移除之后,內存竟然也沒有絲毫的下降,這在APP上可完全不行。一開始我并沒有想到是SD的問題,以為是我代碼有什么問題,造成了循環引用,內存沒有釋放,于是乎,打開Leaks,查起來。

屏幕快照 2016-07-14 下午5.04.59.png

恩,是發現了AF中的一些內存泄漏問題,但是也只有10+KB啊,剩下的150MB的內存是哪里來的呢,只能一步步盤查起來。

B5573D21-43A2-4453-BE49-853A758935D6.png

抽絲剝繭,我們看到,大部分的內存都顯示在SDWebImage的

- (UIImage *)diskImageForKey:(NSString *)key {
    NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];
    if (data) {
        UIImage *image = [UIImage sd_imageWithData:data];
        image = [self scaledImageForKey:key image:image];
        if (self.shouldDecompressImages) {
            image = [UIImage decodedImageWithImage:image];
        }
        return image;
    }
    else {
        return nil;
    }
}

這個方法里產生的

SDWebImage的源碼分析網上一搜一大把,這里就不多說了。這里說一下怎么解決這個內存問題。
首先在網上搜了一下,有的人是直接修改第三方內部源碼解決的。這里不推薦,因為大部分開發者是通過cocoapods安裝的的框架,這里修改起來也不是很方便。

其實很簡單,清除cache,只要在合適的時機去調用它就行

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

使用之后,內存瞬間下來,清清爽爽。

網上說把它放在applicationDidReceiveMemoryWarning里調用,但是我沒有,因為在一些老機型里,比如iPhone4,內存爆炸的時候瞬間就crash了,來不及去調這個,所以我建議在做一些大圖片多圖片處理的時候,最好隨時的去清理一下。

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

推薦閱讀更多精彩內容

  • 問題:控制器里下載N張圖片,當圖片過大(圖片質量和尺寸)使用SDWebImage時,快速滑動頁面進行加載會撐爆內存...
    神采飛揚_2015閱讀 1,491評論 3 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,333評論 25 708
  • 看了看自己的簡書頭像,上面有兩行話:堅持到無能為力 拼搏到感動自己。那么何謂堅持呢,哪種程度又是無能為力呢? 自從...
    杰杰杰靈閱讀 291評論 2 2
  • 今天第一次閱讀這本書,從打開書的第一頁開始,讀了它的序,后來又讀了ta的正文。到現在為止已經閱讀了20%多的內容。...
    舞傾城夏閱讀 359評論 0 0
  • 夕有妹哀傷, 今日天艷陽。 句話解心結, 滴酒謝師兄。
    仁者見智閱讀 315評論 0 0