iOS App内存优化之 解决UIImagePickerController的图片对象占用RAM过高问题
这个坑会在特定的情况下特别明显:

类似朋友圈的添加多张本地选择\拍照 的图片 并在界面上做一个预览功能
由于没有特别的相机\相册需求,则直接使用系统自带的UIImagePickerController
最简单的方法-> UIImagePickerController 选择图片 -> 代理返回图片对象-> 在array中添加图片对象 -> 用collectionview显示-> 提交的时候递归上传array的image内容
然而这里就发现一个会吃内存的坑...
代理返回的UIImage对象 添加到array时,内存暴涨

其实也不是添加对象到array里导致的问题,因为我的collectionview 不reload 的话,图片不显示时 内存也是正常的,只有把这个image对象放置到UIImageView时 内存才会暴涨
因此怀疑是图片解码方面的原因:解码会调用到ram缓存,以便下次读取时不用再次解码
然而为了避免app占用ram过高而被系统kill掉,这个图片必须要处理一下
通过图片重新绘制得到UIImage这个占用内存的情况会消失
因此写个Category方法来简单处理一下就可以了
- (UIImage *)redraw{
CGFloat width = CGImageGetWidth(self.CGImage);
CGFloat height = CGImageGetHeight(self.CGImage);
// 创建一个bitmap的context
// 并把它设置成为当前正在使用的context
UIGraphicsBeginImageContext(CGSizeMake(width, height));
// 绘制图片大小设置
[self drawInRect:CGRectMake(, , width, height)];
// 从当前context中创建一个图片
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
// 使当前的context出堆栈
UIGraphicsEndImageContext();
// 返回新的改变大小后的图片
return image;
}
结果:

这篇不是干货,只是解决了一个小问题.
iOS App内存优化之 解决UIImagePickerController的图片对象占用RAM过高问题的更多相关文章
- iOS app内存分析套路
iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...
- [原]unity3d ios平台内存优化(一)
关于内存优化,人云亦云 各有己见.本文将通过设置Strpping Level ,减少内存使用. 先看三幅图: 1.没做任何优化,默认选项 2.设置Stripping level 为 Use micro ...
- Android APP内存优化之图片优化
网上有很多大拿分享的关于Android性能优化的文章,主要是通过各种工具分析,使用合理的技巧优化APP的体验,提升APP的流畅度,但关于内存优化的文章很少有看到.在Android设备内存动不动就上G的 ...
- iOS app性能优化的那些事
iPhone上面的应用一直都是以流畅的操作体验而著称,但是由于之前开发人员把注意力更多的放在开发功能上面,比较少去考虑性能的问题,可能这其中涉及到objective-c,c++跟lua,优化起来相对 ...
- iOS App 性能优化总结
今天简单总结一些clientapp 优化的方案和方向. 我相信开发一个app大部分团队都能够完毕,可是性能久不一样啦,和我们都写一个冒泡算法一样,我相信每一个人写的冒泡算法都不一样,这些区别就带来了性 ...
- Facebook iOS App如何优化启动时间
http://www.cocoachina.com/ios/20160105/14870.html 提高 Facebook 应用的性能已经成为 Facebook 持续关注的领域.因为我们相信一个高性能 ...
- iOS APP性能优化
:应用启动时间 应用启动时,只加载启动相关的资源和必须在启动时加载的资源. :本地图片加载方式 本地图片加载常用方法有两种: a. [UIImage imageNamed:@"xx.png& ...
- 获取 iOS APP 内存占用的大小
当我们想去获取 iOS 应用的占用内存时,通常我们能找到的方法是这样的,用 resident_size: #import <mach/mach.h> - (int64_t)memory ...
- (Android图片内存优化)Picasso加载图片 教程。。详细版
Picasso 是 Android 上一个强大的图片下载和缓存库. 示例代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 Picasso.with( ...
随机推荐
- canvas水波纹效果
先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围 ...
- vue-cli创建自己的项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- NodeJS+Express+MongoDB 简单个人博客系统【Study笔记】
Blog 个人博客系统 iBlog是在学习NodeJs时候一个练手项目Demo 系统支持用户注册/登录,内容文章查看,评论,后台管理(定制显示的分类版块,进行文章内容添加)超级管理员还可进行用户管理等 ...
- android下的名词/片段解释
关于建项目时候SDK解释 minimum required SDK: 又为miniSdk, 是你程序最低支持的SDK版本,这个现在一般miniSDK设定一般为8或者10 Target SDK:是你程序 ...
- 针对Oracle数据库表中的数据的常见操作
1.查询表中所有数据 select * from 表名; 例:select * from stu; 2.查询的同时修改表中数据 select * from 表名 for update; 例:sele ...
- jquery $.each 和for 怎么跳出循环
jquery $.each 和for 怎么跳出循环 1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环.2.而在jquery中 $.each则对应的使用r ...
- 【原创】Kafka Consumer多线程实例续篇
在上一篇<Kafka Consumer多线程实例>中我们讨论了KafkaConsumer多线程的两种写法:多KafkaConsumer多线程以及单KafkaConsumer多线程.在第二种 ...
- oracle11g的内存分配不当,导致的错误ORA-01034,ORA-00838,ORA-27101
由于开发需要,oracle11g被应用于虚拟机,所以系统资源显得弥足珍贵,百度了一下就有答案. 用dba身份进入Oracle,笔者在plsql中对数据库进行管理: show parameter sga ...
- 【LeetCode】191. Number of 1 Bits
题目: Write a function that takes an unsigned integer and returns the number of ’1' bits it has (also ...
- const vector<int> 和 vector<const int>问题讨论
1.const vector <int> vec(10) —— 与const int a[10]是一回事,意思是vec只有10个元素,不能增加了,里面的元素也是不能变化的 vector&l ...