這個(gè)要記一下,在寫列表型的界面時(shí).期中有不少的圖片加載,因?yàn)橐獎(jiǎng)討B(tài)計(jì)算cell的高度,圖片的個(gè)數(shù),所以我直接就把我以前寫過(guò)的類似的代碼拿過(guò)來(lái),成功加載后出現(xiàn)了崩潰,卻沒(méi)有任何bug,提示,只說(shuō)Restore the connection to "“XXX”的 iPod" and run "XXX" again, or if "XXX" is still running, you can attach to it by selecting Debug > Attach to Process > XXX.,這種情況應(yīng)該是內(nèi)存泄漏或者加載圖片過(guò)大,我就看了下圖片確實(shí)挺大的,近2M,可是怎么辦呢,囧,
想起我以前做過(guò)的處理我是過(guò)濾每張圖片,將每個(gè)圖片都?jí)嚎s成固定大小,太小查看時(shí)就很模糊了,用戶體驗(yàn)很不好,代碼也找不到了,于是去看別人怎么做的,發(fā)現(xiàn)了一個(gè)挺不錯(cuò)的記錄下來(lái)
下面是他寫的
SDWebImage大家肯定都恨熟悉了参淫,國(guó)內(nèi)外太多的App使用其進(jìn)行圖片加載。
但是最近在使用過(guò)程中發(fā)現(xiàn),我用SDWebImage加載多個(gè)圖片泉唁,類似微博動(dòng)態(tài)那種孤荣,在加載的過(guò)程中垃杖。我發(fā)現(xiàn)當(dāng)圖片分辨率比較大的時(shí)候(不是圖片大)羡洛,加載幾張圖片就崩潰了柑司。
網(wǎng)上說(shuō)可以每次加載圖片清空memcache,但是效果并不好忙上。
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
這地方采用的方法是:
第一步:在 UIImage+MultiFormat這個(gè)類里面添加如下壓縮方法
這個(gè)地方有些童鞋找不到就在上面先導(dǎo)入#import"UIImage+MultiFormat.h"然后command進(jìn)去就能找到,直接拷貝下面的方法,然后在第二步的方法里調(diào)用就可以了
+(UIImage *)compressImageWith:(UIImage *)image
{
float imageWidth = image.size.width;
float imageHeight = image.size.height;
float width = 320;
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;
}
第二步: 在下面這個(gè)方法里調(diào)用壓縮方法
+ (UIImage *)sd_imageWithData:(NSData *)data {
UIImage *image;
NSString *imageContentType = [NSData sd_contentTypeForImageData:data];
if ([imageContentType isEqualToString:@"image/gif"]) {
image = [UIImage sd_animatedGIFWithData:data];
}
#ifdef SD_WEBP
else if ([imageContentType isEqualToString:@"image/webp"])
{
image = [UIImage sd_imageWithWebPData:data];
}
#endif
else {
image = [[UIImage alloc] initWithData:data];
if (data.length/1024 > 90) {
image = [self compressImageWith:image];
}
UIImageOrientation orientation = [self sd_imageOrientationFromImageData:data];
if (orientation != UIImageOrientationUp) {
image = [UIImage imageWithCGImage:image.CGImage
scale:image.scale
orientation:orientation];
}
}
return image;
}
第三步:
就是在SDWebImageDownloaderOperation的connectionDidFinishLoading方法里面的:
這里的方法也是先導(dǎo)入#import"SDWebImageDownloaderOperation.h",在點(diǎn)進(jìn)去
UIImage *image = [UIImage sd_imageWithData:self.imageData];
NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:self.request.URL];
image = [self scaledImageForKey:key image:image];
NSData *data = UIImageJPEGRepresentation(image, 1);
self.imageData = [NSMutableData dataWithData:data];
最后;再配合? ??
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];(圖片加載后使用)大功告成拷呆,親測(cè)內(nèi)存基本變化不大,自動(dòng)釋放也來(lái)得及疫粥。
然后確實(shí)很舒服了,也不會(huì)崩潰了,圖片也比較清晰