這幾天在做一個需求,需要在一系列的控制器里下載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了,來不及去調這個,所以我建議在做一些大圖片多圖片處理的時候,最好隨時的去清理一下。