SDWebImage加載多個大圖導(dǎo)致內(nèi)存泄漏崩潰

SDWebImage是iOS開發(fā)者加載網(wǎng)絡(luò)圖片比較常用的開源框架,高效的緩存機(jī)制淘衙,加載根據(jù)緩存取出相對應(yīng)圖片解壓展示,使用戶用起來是非常順暢的彤守。但是我在做圖片輪播的時候,遇到了用戶上傳了多張大圖的時候具垫,大概每張小于1M的,我連續(xù)加載幾個相同的頁面筝蚕,我看到XCode的使用內(nèi)存從20M飆升到500M,接著didReceiveMemoryWarning斷點了起宽,內(nèi)存泄漏,接著程序奔潰了坯沪。由于之前一直聽說SDWebImage加載大圖會奔潰的問題,所以這次遇到叉弦,我直接找SDWebImage的問題的。

1卸奉、直接在UIImage+MultiFormat添加圖片壓縮方法,根據(jù)屏幕比例榄棵,分辨率來壓縮圖片

+(UIImage*)compressImageWith:(UIImage*)image

{

floatimageWidth = image.size.width;

floatimageHeight = image.size.height;

floatwidth =640;

floatheight = image.size.height/(image.size.width/width);

floatwidthScale = imageWidth /width;

floatheightScale = imageHeight /height;

// 創(chuàng)建一個bitmap的context

// 并把它設(shè)置成為當(dāng)前正在使用的context

if([[UIScreenmainScreen]scale] ==2.0){

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height),NO,2.0);

}elseif([[UIScreenmainScreen]scale] ==3.0){

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height),NO,3.0);

}

else{

UIGraphicsBeginImageContext(CGSizeMake(width, height));

}

if(widthScale > heightScale) {

[imagedrawInRect:CGRectMake(0,0, imageWidth /heightScale , height)];

}

else{

[imagedrawInRect:CGRectMake(0,0, width , imageHeight /widthScale)];

}

// 從當(dāng)前context中創(chuàng)建一個改變大小后的圖片

UIImage*newImage =UIGraphicsGetImageFromCurrentImageContext();

// 使當(dāng)前的context出堆棧

UIGraphicsEndImageContext();

returnnewImage;

}

2、在UIImage+MultiFormat原有的方法sd_imageWithData中調(diào)用compressImageWith方法

+ (UIImage*)sd_imageWithData:(NSData*)data {

if(!data) {

returnnil;

}

UIImage*image;

NSString*imageContentType = [NSDatasd_contentTypeForImageData:data];

if([imageContentTypeisEqualToString:@"image/gif"]) {

image = [UIImagesd_animatedGIFWithData:data];

}

#ifdef SD_WEBP

elseif([imageContentType isEqualToString:@"image/webp"])

{

image = [UIImage sd_imageWithWebPData:data];

}

#endif

else{

image = [[UIImagealloc]initWithData:data];

if(data.length/1024>128) {

image = [selfcompressImageWith:image];

}

UIImageOrientationorientation = [selfsd_imageOrientationFromImageData:data];

if(orientation !=UIImageOrientationUp) {

image = [UIImageimageWithCGImage:image.CGImage

scale:image.scale

orientation:orientation];

}

}

returnimage;

}

3疹鳄、最后一步,在SDWebImageDownloaderOperation的connectionDidFinishLoading添加根據(jù)判斷圖片類型進(jìn)行壓縮

if(self.options&SDWebImageDownloaderIgnoreCachedResponse&&responseFromCached) {

completionBlock(nil,nil,nil,YES);

}elseif(self.imageData) {

UIImage*image = [UIImagesd_imageWithData:self.imageData];

NSString*key = [[SDWebImageManagersharedManager]cacheKeyForURL:self.request.URL];

image = [selfscaledImageForKey:keyimage:image];

//自己添加

NSPUIImageTypeimageType =NSPUIImageTypeFromData(self.imageData);

if(imageType ==NSPUIImageType_PNG) {

NSData*data =UIImagePNGRepresentation(image);

self.imageData= [NSMutableDatadataWithData:data];

}elseif(imageType ==NSPUIImageType_JPEG) {

NSData*data =UIImageJPEGRepresentation(image,1);

self.imageData= [NSMutableDatadataWithData:data];

}

//判斷圖片格式內(nèi)聯(lián)方法

/*

typedef NS_ENUM(NSInteger, NSPUIImageType) {

NSPUIImageType_JPEG,

NSPUIImageType_PNG,

NSPUIImageType_Unknown

};*/

staticinlineNSPUIImageTypeNSPUIImageTypeFromData(NSData*imageData)

{

if(imageData.length>4) {

constunsignedchar*bytes = [imageDatabytes];

if(bytes[0] ==0xff&&

bytes[1] ==0xd8&&

bytes[2] ==0xff)

{

returnNSPUIImageType_JPEG;

}

if(bytes[0] ==0x89&&

bytes[1] ==0x50&&

bytes[2] ==0x4e&&

bytes[3] ==0x47)

{

returnNSPUIImageType_PNG;

}

}

returnNSPUIImageType_Unknown;

}

添加完畢垫蛆,再來看看內(nèi)存腺怯,明顯感覺內(nèi)存使用小很多了袱饭,解決完畢呛占。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晾虑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帜篇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笙隙,死亡現(xiàn)場離奇詭異,居然都是意外死亡竟痰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門凯亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哄尔,“玉大人,你說我怎么就攤上這事岭接。” “怎么了鸣戴?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長窄锅。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么追驴? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮暇咆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爸业。我一直安慰自己,他們只是感情好扯旷,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布拆挥。 她就那樣靜靜地躺著薄霜,像睡著了一般纸兔。 火紅的嫁衣襯著肌膚如雪惰瓜。 梳的紋絲不亂的頭發(fā)上汉矿,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機(jī)與錄音洲拇,去河邊找鬼。 笑死赋续,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纽乱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸦列,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了薯嗤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骆姐,失蹤者是張志新(化名)和其女友劉穎捏题,沒想到半個月后繁仁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涉馅,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡黄虱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捻浦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡朱灿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盗扒,到底是詐尸還是另有隱情,我是刑警寧澤侣灶,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站褥影,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凡怎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一统倒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧房匆,春花似錦、人聲如沸坛缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骗卜。三九已至宠页,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間举户,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工俭嘁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人供填。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像近她,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粘捎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容