今天在4S真机上频繁发生闪退问题,并且在控制台打印:Received memory warning.打印三次之后就会造成程序闪退.
这是因为4S真机上内存过小,而在多个cell上图片占用内存过多, 虽然是tableView上是复用的, 图片分辨率过大,依然会出现内存警告的问题.因为我们一直都是使用SDWebImage来加载图片.所以就要从这里来下手解决了.
网上说可以每次加载图片清空memcache,但是效果并不好。
[[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];
或者是把下面这个方法全部注释掉
+ (UIImage *)decodedImageWithImage:(UIImage *)image
但是效果不明显同时加载5-7张高分辨率图片的话还是会立即崩溃
这就需要我们进入到SDWebImage内部去把图片进行等比例的压缩了.下面就是具体的操作步骤
我们在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
// 并把它设置成为当前正在使用的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中创建一个改变大小后的图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
return newImage;
}
然后在下面这张图片箭头所指处对图片进行压缩
添加上这句代码:
if (data.length/1024 > 128) {
image = [self compressImageWith:image];
}
如图:
接下来就要去SDWebImageDownloaderOperation的connectionDidFinishLoading方法里面的:UIImage *image = [UIImage sd_imageWithData:self.imageData];箭头所指处将等比压缩过的image在赋在转成data赋给self.imageData
//将等比压缩过的image在赋在转成data赋给self.imageData
NSData *data = UIImageJPEGRepresentation(image, 1);self.imageData = [NSMutableData dataWithData:data];
如图:
再配合 [[SDImageCache sharedImageCache] setValue:nil forKey:@"memCache"];图片加载后使用就可以了.