SDWebImage載入多個圖片記憶體崩潰的問題
SDWebImage大家肯定都恨熟悉了,國內外太多的App使用其進行圖片載入。
但是最近在使用過程中發現,我用SDWebImage載入多個圖片,類似微博動態那種,在載入的過程中。我發現當圖片解析度比較大的時候(不是圖片大),載入幾張圖片就崩潰了。
網上說可以每次載入圖片清空memcache,但是效果並不好。
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
也有說把使用下面這個方法的地方全部注掉
+ (UIImage *)decodedImageWithImage:(UIImage *)image
但是效果並不明顯。同時載入5-7張高解析度圖片還是會立即崩潰
我們使用SDWebimage肯定都會做三件事,一判斷本地是否有這張圖,二有的時候直接從本地取圖片,三沒有的時候去網路下載。
大概是像下面這樣
NSString *logoString = [_currentDic stringValueForKey:@"team_img"];if(logoString.length>0){[[SDImageCache sharedImageCache] queryDiskCacheForKey:logoString done:^(UIImage *image, SDImageCacheType cacheType) {if (image) {[_teamImage setImage:image];}else{[_teamImage sd_setImageWithURL:kNSUrl(logoString)placeholderImage:IMGNAMED(@"defaultAvatar2")options:SDWebImageRefreshCachedcompleted:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {if (image) {[[SDImageCache sharedImageCache] storeImage:image forKey:logoString toDisk:YES];}}];}}];}
在內部都會使用到下面這個方法
- (UIImage *)diskImageForKey:(NSString *)key {NSData *data = [self diskImageDataBySearchingAllPathsForKey:key];if (data) {UIImage *image = [UIImage sd_imageWithData:data];image = [self scaledImageForKey:key image:image];image = [UIImage decodedImageWithImage:image];return image;}else {return nil;}}
我發現這裡
UIImage *image = [UIImage sd_imageWithData:data];
圖片取出來的時候就已經巨大無比,佔用了很大的記憶體,導致記憶體來不及釋放就崩潰。
抽絲剝繭我們進入
sd_imageWithData方法
發現這裡面對圖片的處理是直接按照原大小進行的,如果幾千是解析度這裡導致佔用了大量記憶體。
所以我們需要在這裡對圖片做一次等比的壓縮。
我們在
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;// 建立一個bitmap的context// 並把它設定成為當前正在使用的contextUIGraphicsBeginImageContext(CGSizeMake(width, height));if (widthScale > heightScale) {[image drawInRect:CGRectMake(0, 0, imageWidth /heightScale , height)];}else {[image drawInRect:CGRectMake(0, 0, width , imageHeight /widthScale)];}// 從當前context中建立一個改變大小後的圖片UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();// 使當前的context出堆疊UIGraphicsEndImageContext();return newImage;}
再在上面箭頭程式碼後面對圖片進行壓縮
#ifdef SD_WEBPelse if ([imageContentType isEqualToString:@"image/webp"]){image = [UIImage sd_imageWithWebPData:data];}#endifelse {image = [[UIImage alloc] initWithData:data];if (data.length/1024 > 128) {image = [self compressImageWith:image];}UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];if (orientation != UIImageOrientationUp) {image = [UIImage imageWithCGImage:image.CGImagescale:image.scaleorientation:orientation];}
到了這裡還需要進行最後一步。就是在SDWebImageDownloaderOperation的connectionDidFinishLoading方法裡面的:
UIImage *image = [UIImage sd_imageWithData:self.imageData];
//將等比壓縮過的image在賦在轉成data賦給self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];
再配合 [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];(圖片載入後使用)大功告成,親測記憶體基本變化不大,自動釋放也來得及。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75/viewspace-2805397/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 小程式記憶體問題–圖片懶載入記憶體
- UE4 記憶體寫壞導致異常崩潰問題記錄記憶體
- SDWebImage載入圖片的URL是同一個(如何處理)Web
- SDWebImage 載入https報錯 無法載入問題WebHTTP
- 圖片預載入,圖片懶載入,和jsonp中的一個疑問JSON
- 記一次線上崩潰問題的排查過程
- 崩潰的一天,西安一碼通崩潰背後的技術問題。
- AI|經常崩潰的問題解決AI
- 記錄一個LifeCycle 多執行緒使用導致的崩潰執行緒
- 關於在 Linux 下多個不相干的程式互斥訪問同一片共享記憶體的問題Linux記憶體
- 不生成core檔案的記憶體越界快速定位方法/記憶體越界定位/地址崩潰定位方法記憶體
- 崩潰日記
- 記一次 Windows10 記憶體壓縮模組 崩潰分析Windows記憶體
- Android9.0使用Glide載入圖片問題AndroidIDE
- 一個SMMU記憶體訪問異常的問題記憶體
- iOS圖片記憶體優化iOS記憶體優化
- 多型記憶體圖解多型記憶體圖解
- 記錄一次解決App崩潰問題的解決方案APP
- 記在Linux上定位後臺服務偶發崩潰的問題Linux
- memcopy 導致的程式碼崩潰問題,memcpy的三大踩坑記memcpy
- SDWebImage在iOS12上WebP格式圖片不顯示問題WebiOS
- Go記憶體架構,一個有趣的問題Go記憶體架構
- win10 16g記憶體玩英雄聯盟崩潰怎麼解決_win10 16g記憶體玩英雄聯盟老崩潰修復方法Win10記憶體
- 排查Java的記憶體問題Java記憶體
- 如何定位瀏覽器頁面崩潰的問題瀏覽器
- 聊一聊 Valgrind 監視非託管記憶體洩露和崩潰記憶體洩露
- Fdmemtable 記憶體表儲存圖片的例子記憶體
- js:原生多張圖片延遲載入(圖片自己找)JS
- [效能]【JVM】關於JVM記憶體的N個問題JVM記憶體
- 探究 iOS 記憶體問題iOS記憶體
- SQLServer記憶體問題分析SQLServer記憶體
- iOS 除SDWebImage之外清理記憶體中快取iOSWeb記憶體快取
- 頁面崩潰了!記錄一次測試中出現的前端記憶體溢位現象前端記憶體溢位
- iOS相關 | Xcode8 ---- iOS 9.2 崩潰問題iOSXCode
- 比特幣內訌引發的未來崩潰問題 | Justin比特幣
- 記憶體分配問題處理記憶體
- ThreadLocal記憶體洩漏問題thread記憶體
- 幽蘭核心崩潰自救記