這幾天在做一個(gè)需求回官,需要在一系列的控制器里下載N張圖片甘畅。最方便最省事的解決方案當(dāng)然首選SDWebImage這個(gè)框架(相信也很少不去用它的)。把圖片地址放進(jìn)去康吵,返回一個(gè)圖片劈榨,輕松,快捷晦嵌,令人幸福同辣,直到看到下面這個(gè)畫(huà)面。
什么鬼惭载!內(nèi)存竟然從20M給我彪到了180+M旱函!而且當(dāng)我把控制器移除之后,內(nèi)存竟然也沒(méi)有絲毫的下降描滔,這在APP上可完全不行棒妨。一開(kāi)始我并沒(méi)有想到是SD的問(wèn)題,以為是我代碼有什么問(wèn)題含长,造成了循環(huán)引用券腔,內(nèi)存沒(méi)有釋放,于是乎拘泞,打開(kāi)Leaks纷纫,查起來(lái)。
恩陪腌,是發(fā)現(xiàn)了AF中的一些內(nèi)存泄漏問(wèn)題辱魁,但是也只有10+KB啊烟瞧,剩下的150MB的內(nèi)存是哪里來(lái)的呢,只能一步步盤(pán)查起來(lái)染簇。
抽絲剝繭参滴,我們看到,大部分的內(nèi)存都顯示在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;
}
}
這個(gè)方法里產(chǎn)生的
SDWebImage的源碼分析網(wǎng)上一搜一大把锻弓,這里就不多說(shuō)了砾赔。這里說(shuō)一下怎么解決這個(gè)內(nèi)存問(wèn)題。
首先在網(wǎng)上搜了一下弥咪,有的人是直接修改第三方內(nèi)部源碼解決的过蹂。這里不推薦,因?yàn)榇蟛糠珠_(kāi)發(fā)者是通過(guò)cocoapods安裝的的框架聚至,這里修改起來(lái)也不是很方便。
其實(shí)很簡(jiǎn)單本橙,清除cache扳躬,只要在合適的時(shí)機(jī)去調(diào)用它就行
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
使用之后,內(nèi)存瞬間下來(lái)甚亭,清清爽爽贷币。
網(wǎng)上說(shuō)把它放在applicationDidReceiveMemoryWarning里調(diào)用,但是我沒(méi)有亏狰,因?yàn)樵谝恍├蠙C(jī)型里役纹,比如iPhone4,內(nèi)存爆炸的時(shí)候瞬間就crash了暇唾,來(lái)不及去調(diào)這個(gè)促脉,所以我建議在做一些大圖片多圖片處理的時(shí)候,最好隨時(shí)的去清理一下策州。