iOS开发中,必然会使用到显示图片.然而在你的APP中使用大量图片以后,检查内存时你会发现,哇!!!内

存已经超过200M甚至更多(模拟器中内存上不封顶).这时iPhone4很容易造成程序闪退,如果内存控制的很不好,即使是6s也会发生程序闪退.

当发生这种情况时,我想你一定使用过 如下方法

let newImageData = UIImageJPEGRepresentation(newImage, 0.5)

这样类似的方法可以减少图片的大小.但是效果.一张30M的图片,压缩以后还剩15M?还是太大了,这样十张图片就150M了,加上一些基础的功能,一个APP内存超过200M根本不是事.当你的程序进入后台,一段时间不使用,当你再次进入这个APP的时候,你就需要重新加载这个APP.但是你会发现一些优秀的APP在进入后台后,再次唤醒时,是恢复进入后台前的状态.

why?因为你的APP在进入后台一段时间以后,所占内存被系统自动清理了...因为你的APP所占内存过大.iOS系统有优秀的内存清理机制,使得系统随时有足够的空闲内存.一些所占内存过大的应用,在进入后台一段时间以后,就会被系统关闭,并且释放内存.所以当你再次进入这个应用的时候,不是恢复到之前的状态,而是从新加载.

当你使用

UIImagePickerController

这个方法来调用图片库和相机的时候,你所选择的图片是原图.这个图片所占内存空间是非常大的.选择的图片会被加载到内存.连续选择多张图片会直接使得程序闪退.即使使用UIImageJPEGRepresentation或者类似的压缩图片的方法也不会解决根本的问题.那么如何加载图片才能有效的控制内存呢?

答案是画布

UIGraphicsBeginImageContext

当你选择图片的时候,可以根据你的iPhone的屏幕大小,来进行截图.这样得来的图片会由原来的800W像素降低为手机屏幕的像素.再进行一次压缩,这样得来的图片大小之后10-25K的大小.画质呢?用手机看,不进行缩放的情况下,和原图是一模一样.内存瞬间无压力了.尤其是即时聊天,发送图片,节约流量,图片又清晰.

代码如下:

func useImage(image: UIImage) -> NSData {//实现等比例缩放let hfactor = image.size.width / screnWidth;let vfactor = image.size.height / screnHeight;let factor = fmax(hfactor, vfactor);//画布大小let newWith: CGFloat = image.size.width / factorlet newHeigth: CGFloat = image.size.height / factorlet newSize = CGSize(width: newWith, height: newHeigth)UIGraphicsBeginImageContext(newSize)image.drawInRect(CGRect(x: 0, y: 0, width: newWith, height: newHeigth))let newImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()//图像压缩let newImageData = UIImageJPEGRepresentation(newImage, 0.5)return newImageData!}

以上想法来自于我的好友,ChengboQin.

iOS图片占内存过大的问题完美解决相关推荐

  1. 微信小程序使用Echarts真机调试报错,Echarts占内存过大解决方法

    Echarts真机调试报错 解决办法:给组件添加force-use-old-canvas="true"属性就可以在真机调试里展示. 重点:发布线上时,一定要将这句去掉,现在只是不支 ...

  2. Linux系统盘爆满根目录100%,又找不到占空间的大文件 原因与解决方法

    最近一位朋友他的Linux(Centos7)根目录一直100%,也就是系统文件磁盘已经爆满了.虽然通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间(6.5G ...

  3. 查看计算机内存占用快捷方式,电脑内存占用大的几种解决方法

    很多人玩着游戏或者看电影的时候,会跳出个提示,显示电脑内存占用大,电脑内存占用大是什么原因造成,针对这种问题有什么好的解决方法,就让小编告诉你们电脑内存占用大的几种解决方法. 电脑内存占用大的几种解决 ...

  4. Python:matplotlib pyplot库函数 savefig所支持的格式以及图片插入word保存后模糊的完美解决方法

    Python:matplotlib pyplot库函数 savefig所支持的格式以及图片插入word保存后模糊的完美解决方法 202012月更新 savefig支持的格式 图片插入word,保存后不 ...

  5. JAVA之NIO按行读写大文件,完美解决中文乱码问题

    JAVA之NIO按行读写大文件,完美解决中文乱码问题 参考文章: (1)JAVA之NIO按行读写大文件,完美解决中文乱码问题 (2)https://www.cnblogs.com/jpfss/p/89 ...

  6. 苹果手机其他占内存很大去哪删除_Iphone内存总是不够用?原来这才是正确清理垃圾的方法,长见识了...

    现在很多年轻人都很喜欢苹果手机,很大一部分原因是他们觉得苹果手机不卡顿.可以手机使用久了难免会缓存很多垃圾,占用内存,拖慢手机运行速度.今天教大家iPhone正确清理手机垃圾的方法. 1.清除浏览器垃 ...

  7. 苹果手机其他占内存很大去哪删除_手机没内存,照片又不舍得删除?这里有6大方法能帮你解决!...

    虽说目前市面上可供购买的智能手机之中,大部分的内存都很大,可是,这一点并不足以成功吸引到多数的手机用户去更换手机.一般而言,我们的手机只要它的外观保护得较好,内在性能也还算过得去的话,我们大都不会买新 ...

  8. iOS 图片下拉变大

    前言 在iOS的开发中TableView和ScrollView是可以上下滑动的,但是在下拉的过程中,顶部会出现留白的现象,于是就出现了类似于QQ空间中那样下拉顶部的图片变大的效果.看起看很高大上,其实 ...

  9. 每日三思:优化微信小程序中倒计时占内存较大(19-0612-1917)

    小程序的倒计时存在暂用手机内存较大的问题,尤其是在列表中,如果每一项都有倒计时的话,一进页面就会卡死 解决思路 每次启用倒计时的时候,先清除倒计时,再启用(也就是一条腿走路,内存中只有当前的倒计时); ...

最新文章

  1. C语言case次数有限制吗,用switch...case语句统计数字、空格和其他字符出现的次数...
  2. java窗口怎么实现修改密码_【求助】Java中如何实现更改windows密码
  3. 性能分析--视图优化
  4. 制作越狱版本的ipa文件
  5. [转]在ASP.NET中如何用C#.NET实现基于表单的验证(二)
  6. 割平面法只能求解纯整数规划吗_离散规划 解法
  7. Exchange 2003升级至Exchange 2007
  8. python连接数据库oracle_python连接oracle数据库
  9. 008_使用pyenv进行py开发环境管理
  10. Java多线程详解(线程不安全案例)
  11. 转:基于用户投票的排名算法系列
  12. keras提取模型中的某一层_Keras做图片分类(四):迁移学习--猫狗大战实战
  13. 理解文档对象模型(2)
  14. 01. 仔细区分pointer和references
  15. Android Parcel对象详解
  16. 傅立叶变换的物理意义(转)
  17. Mycat生产实践---数据迁移与扩容实践
  18. Linux平台上文件同步——rsync+inotify之实时同步
  19. 玩转数据可视化之R语言ggplot2:(八)ggplot2绘制空间地理数据图
  20. 数字逻辑-头歌实训作业-译码器设计与应用(Logisim)

热门文章

  1. C++精确到小数点后两位取值
  2. word中,去表格格式,把表格转换为文本的方法
  3. 【8.6】代码源 - 【前缀集】【矩阵游戏】【谁才是最终赢家?】【放置多米诺骨牌】
  4. 地鼠君黑盒测试--小白功能测试避雷经验分享
  5. 在Android面试前背八股和学面试技巧真的有用吗?
  6. 微信小程序自定义组件使用canvas绘图,无法绘制以及fail canvas is empty问题
  7. SRS-开源流媒体服务器
  8. python云计算1
  9. 芒果超媒的2022年报:一半明媚,一半忧伤
  10. 关于Xshell无法连接VM中的openEuler的解决思路