美文网首页iOS经验总结
iOS内存警告问题解决

iOS内存警告问题解决

作者: 丸_子 | 来源:发表于2017-08-18 16:28 被阅读483次

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

相关文章

  • 收藏文章

    ios 处理内存警告

  • iOS内存警告问题解决

    今天在4S真机上频繁发生闪退问题,并且在控制台打印:Received memory warning.打印三次之后就...

  • iOS内存警告问题解决

    今天在4S真机上频繁发生闪退问题,并且在控制台打印:Received memory warning.打印三次之后就...

  • iOS内存警告

    1.当iOS系统内存不足,会发出内存警告的通知。首先调用的是 AppDelegate 里重新的内存警告代理方法 2...

  • iOS didReceiveMemoryWarning 的方法理

    参考文档:27.iOS内存警告处理(didReceiveMemoryWarning) 总结: (1)当应用可用内存...

  • 性能优化[US]

    iOS性能优化,主要围绕以下问题解决的: 内存内存布局retainweak RunloopNSTimer面试-Ru...

  • iOS如何优化内存(二)

    11.处理内存警告 一旦系统内存过低,iOS会通知所有运行中app。如果你的app收到了内存警告,它就需要尽可能释...

  • 收到内存警告的时候

    在iOS6以后收到内存警告的时候 - (void)didReceiveMemoryWarning { //当收到内...

  • iOS6、7、8、9新特性汇总和适配说明

    一、关于内存警告ios6中废除了viewDidUnload,viewWillUnload这两个系统回调,收到内存警...

  • iOS内存警告处理

    只要出现内存警告的时候,会第一时间执行 AppDelegate 的 - (void)applicationDidR...

网友评论

    本文标题:iOS内存警告问题解决

    本文链接:https://www.haomeiwen.com/subject/diparxtx.html