轉(zhuǎn)載:https://blog.csdn.net/benyoulai5/article/details/50462586胶征。自己抄錄僅作學習弃揽。
之前做的一個項目中疙驾,一個tableview的列表加載了很多圖片癣朗,并且后臺返回的圖片都是大圖茅茂,并不是壓縮圖,導致一下子內(nèi)存過大罢维,就崩潰了
網(wǎng)上給的方法說可以每次加載圖片清空memchche淹仑,但是效果并不好丙挽。
[[SDImageCache sharedImageCache] setValue: nil forKey:@"memCache"];
也有說把使用下面這個方法的地方全部注釋掉
+(UIImage *)decodedImageWithImage:(UIImage *)image
但是效果并不明顯,同時加載多張高分辨率圖片還是會立即崩潰
我們使用SDWebImage肯定會做的三件事匀借,一是判斷本地是否有這張圖颜阐,二是有的時候直接從本地讀取圖片,三是本地沒有圖片就去網(wǎng)絡上下載吓肋。大概像這樣
NSString * logoString = [_currentDic stringValueForKey:@"team_img"];
if (logoString.length>0){
[SDImageCache shareImageCache] queryDiskCacheForKey:logoString done:^(UIImage *image,SDImageCacheType cacheType) {
if (image) {
[_teamImage setImage:image];
}else{
[_teamImage sd_setImageWithURL:kNSUrl(logoString) placeholderImage: IMGNAMED(@"defaultAvatar2")] options: SDWebImageRefreshCached completed:^(UIImage *image,NSError *error,SDIMageCacheType cacheType, NSURL *imageURL) {
if(image){
[[SDImageCache sharedImageCache] storeImage:image forKey:logoString toDisk: YES];
}
}
}
}];
}
在內(nèi)部都是使用到下面這個方法
-(UIImage *)diskImageForKey:(NSString *)key {
NSData * data = [self diskImageDataBySearchAllPathForKey:key];
if (data){
UIImage * image = [UIImage sd_imageWithData: data];
image = [self scaledImageForKey: key image:image];
image = [UIImage decodeImageWithImage: image];
}else{
return nil
}
}
重點是這里
UIImage *image = [UIIMage sd_imageWithData:data];
圖片取出來的時候就已經(jīng)巨大無比凳怨,占用了很大的內(nèi)存,導致內(nèi)存來不及釋放就崩潰了是鬼。接下來進入
sd_imageWithData方法
發(fā)現(xiàn)這里面對圖片的處理是直接按照原大小進行的肤舞,如果幾千是分辨率這里導致占用了大量內(nèi)存!所以我們需要在這里對圖片做一次等比壓縮
我們在UIImage+MultiFormat這個類里面添加如下壓縮方法。
+(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)建一個bitmap的context
// 并把它設(shè)置成為當前正在使用的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)];
}
// 從當前context中創(chuàng)建一個改變大小后的圖片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使當前的context出堆棧
UIGraphicsEndImageContext();
return newImage;
}
再在上面箭頭代碼后面對圖片進行壓縮!到了這里還需進行最后一步均蜜,就是在SDWebImageDownloadOperation的connectionDidFinishLoading方法里面的:
UIImage *image = [UIImage sd_imageWithData:self.imageData];
添加后面代碼
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];
就是這樣子再配合[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];圖片加載出來之后使用這行代碼
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
大功告成李剖!親測內(nèi)存變化不大,自動釋放也來得及囤耳。
關(guān)閉打賞篙顺,僅作學習!