zoukankan      html  css  js  c++  java
  • 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(0, 0, width, height)];
        
        // 从当前context中创建一个图片
        UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 使当前的context出堆栈
        UIGraphicsEndImageContext();
        
        // 返回新的改变大小后的图片
        return image;
    }

    结果:

    这篇不是干货,只是解决了一个小问题.

  • 相关阅读:
    yii2 批量插入
    yii2 ArrayHelper的19个函数+使用实例+功能详解
    thinkphp phpexcel
    yii2 ActiveForm beforeSubmit用法
    YII2项目常用技能知识总结
    Redis 的 fields 遇到的问题
    spring boot +mybatis+druid 多数据源配置
    简单使用shell 自动打包,发布项目 脚本
    cmpp 短信平台
    mysql workbench 导出表结构
  • 原文地址:https://www.cnblogs.com/n1ckyxu/p/7245009.html
Copyright © 2011-2022 走看看