項(xiàng)目中有一個(gè)控制器里的圖片服務(wù)器那邊沒有進(jìn)行壓縮 所以使用SDWebImage顯示在collectionView/tableView的時(shí)候有時(shí)會(huì)crash(及時(shí)沒有反復(fù)進(jìn)幾次就會(huì)crash了)萤捆。網(wǎng)上查了很多資料萍摊,大致總結(jié)有一下幾種方法:
1梢夯、每次加載高清圖片時(shí)清空memcache
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
但是這種方法會(huì)產(chǎn)生一個(gè)效果:當(dāng)滑動(dòng)tableView的時(shí)候 cell消失在屏幕中再滑回來圖片會(huì)從新加載阿蝶。
2.取消解壓縮
[SDImageCache sharedImageCache].shouldDecompressImages = NO;
[SDWebImageDownloader sharedDownloader].shouldDecompressImages = NO;
之所以產(chǎn)生crash的原因柬甥,是因?yàn)樵赟DWebImage里的這個(gè)方法decodedImageWithImage在加載高清圖片是占用了大量?jī)?nèi)存饮六。所以上面的兩行代碼就禁止調(diào)用了這個(gè)方法,那么問題來了苛蒲,那這個(gè)方法存在的意義又是什么呢卤橄?
因?yàn)槲覀儗?duì)圖片的展示大部分是在tableviews/collectionview里 其實(shí)decodedImageWithImage方法是對(duì)圖片進(jìn)行解壓縮并且緩存起來,以提高流暢度臂外。但是加載高分辨率的圖片就會(huì)起到適得其反的效果窟扑。所以在加載高分辨率圖片的地方調(diào)用以上兩個(gè)方法,其他地方仍然保持為YES就可以了漏健。如果再限制圖片內(nèi)存緩存最高限制就更安全了
3.對(duì)圖片進(jìn)行等比例壓縮(需修改源碼)
這里面對(duì)圖片的處理是直接按照原大小進(jìn)行的辜膝,如果分辨率很大這里導(dǎo)致占用了大量?jī)?nèi)存。所以我們需要在這里對(duì)圖片做一次等比的壓縮漾肮。
在UIImage+MultiFormat這個(gè)類里面添加如下壓縮方法
+(UIImage *)compressImageWith:(UIImage *)image{
float imageWidth = image.size.width;
float imageHeight = image.size.height;
float width = 640;
float height = image.size.height/(image.size.width/width);
float widthScale = imageWidth /width;
float heightScale = imageHeight /height;
// 創(chuàng)建一個(gè)bitmap的context
// 并把它設(shè)置成為當(dāng)前正在使用的context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
if (widthScale > heightScale) {
[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];
}
else {
image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];
}
// 從當(dāng)前context中創(chuàng)建一個(gè)改變大小后的圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使當(dāng)前的context出堆棧
UIGraphicsEndImageContext();
return newImage;
}
在上圖箭頭位置這樣調(diào)用
image = [[UIImage alloc] initWithData:data];
if (data.length/1024 > 128) {
image = [self compressImageWith:image];
}
到了這里還需要進(jìn)行最后一步。就是在SDWebImageDownloaderOperation的connectionDidFinishLoading方法里面的:
UIImage *image = [UIImage sd_imageWithData:self.imageData];
//將等比壓縮過的image在賦在轉(zhuǎn)成data賦給self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];
但是我在嘗試這個(gè)方法的時(shí)候只這樣操作的話還是會(huì)crash茎毁,所以還是要配合下面這個(gè)方法使用克懊,所以那個(gè)郁悶俺栏ā!L犯取G蕉!大家也可以嘗試一下
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
最終我是選擇了第二種扮念。歡迎補(bǔ)充损搬!