iOS内存警告问题解决

今天在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"];图片加载后使用就可以了.

推荐阅读更多精彩内容