iOS进阶之加载大量本地图片时内存飙升
时间:2019-10-31
本文章向大家介绍iOS进阶之加载大量本地图片时内存飙升,主要包括iOS进阶之加载大量本地图片时内存飙升使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
今天遇到了这个问题,app里拍了100多张图片,每张图片大概200KB左右的大小,当进入CollectionView进行图片展示时,内存出现飙升,上下滑动时会闪退。
在网上找了许多方案都没能解决,最后看到一篇文章后,才解决了这个问题。
下面介绍一下自己的解决办法:
场景:我这里使用的是UICollectionView来进行展示,一行显示4张图片,大概六七行。
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.photoList.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { // 每一张图片都是唯一的Cell NSString *cellID = [NSString stringWithFormat:@"%@_%zd", TestCellID, indexPath.item]; [collectionView registerNib:[UINib nibWithNibName:@"TestCell" bundle:nil] forCellWithReuseIdentifier:cellID]; TestCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath]; cell.model = self.photoList[indexPath.item]; return cell; }
在cell中使用一个变量来保存数据,如果存在数据,则不需要再次加载。在加载图片的时候,对图片进行压缩(可根据自己的需求进行修改)。
#import "TestCell.h" #import "TestModel.h" @interface TestCell () @property (weak, nonatomic) IBOutlet UIImageView *photoImage; /** 保存模型 */ @property(nonatomic, strong) TestModel *saveModel; @end @implementation TestCell - (void)setModel:(TestModel *)model { _model = model; if (self.saveModel.ID.length > 0) { return; } else { self.saveModel = model; } dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSData *data = [[NSData alloc] initWithContentsOfFile:model.path]; UIImage *tempImage = [UIImage imageWithData:data]; // 这步操作比较耗时 image = [tempImage resizeScaleImage:0.1]; dispatch_async(dispatch_get_main_queue(), ^{ self.photoImage.image = image; }); } } - (TestModel *)saveModel { if (!_saveModel) { _saveModel = [[TestModel alloc] init]; } return _saveModel; } @end
这样就完美解决了内存飙升导致app闪退了,至于里面使用到的 resizeScaleImage: 方法,可以去看看《iOS图片内存优化》这篇文章。
原文地址:https://www.cnblogs.com/sjxjjx/p/11772396.html
- 修改Apache的超时设置,解决长连接请求超时问题
- Oracle 12cR2初体验(r11笔记第91天)
- MySQL中的undo截断(r11笔记第89天)
- Linux系统 df 命令显示异常、分区丢失问题解决
- MySQL主从、字典死锁、连接数的Python监控脚本
- MySQL Online DDL(二)(r11笔记第88天)
- 转-Android上面运行golang
- Golang适合高并发场景的原因分析
- 浅谈MySQL中的事务隔离级别(r11笔记第86天)
- 巧用echo命令解决Samba批量添加用户难题
- 分分钟搭建MySQL Group Replication测试环境(r11笔记第82天)
- MySQL 5.7 Group Replication错误总结(r11笔记第84天)
- 空结构体struct{}解析
- 动态创建MySQL Group Replication的节点(r11笔记第84天)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释