UIImage 缓存是怎么回事?

通过 imageNamed 创建 UIImage 时,系统实际上只是在 Bundle 内查找到文件名,然后把这个文件名放到 UIImage 里返回,并没有进行实际的文件读取和解码。当 UIImage 第一次显示到屏幕上时,其内部的解码方法才会被调用,同时解码结果会保存到一个全局缓存去。据我观察,在图片解码后,App 第一次退到后台和收到内存警告时,该图片的缓存才会被清空,其他情况下缓存会一直存在。

我要是用 imageWithData 能不能避免缓存呢?

不能。通过数据创建 UIImage 时,UIImage 底层是调用 ImageIO 的 CGImageSourceCreateWithData() 方法。该方法有个参数叫 ShouldCache,在 64 位的设备上,这个参数是默认开启的。这个图片也是同样在第一次显示到屏幕时才会被解码,随后解码数据被缓存到 CGImage 内部。与 imageNamed 创建的图片不同,如果这个图片被释放掉,其内部的解码数据也会被立刻释放。

怎么能避免缓存呢?

1. 手动调用 CGImageSourceCreateWithData() 来创建图片,并把 ShouldCache 和 ShouldCacheImmediately 关掉。这么做会导致每次图片显示到屏幕时,解码方法都会被调用,造成很大的 CPU 占用。
2. 把图片用 CGContextDrawImage() 绘制到画布上,然后把画布的数据取出来当作图片。这也是常见的网络图片库的做法。

我能直接取到图片解码后的数据,而不是通过画布取到吗?

1.CGImageSourceCreateWithData(data) 创建 ImageSource。
2.CGImageSourceCreateImageAtIndex(source) 创建一个未解码的 CGImage。
3.CGImageGetDataProvider(image) 获取这个图片的数据源。
4.CGDataProviderCopyData(provider) 从数据源获取直接解码的数据。
ImageIO 解码发生在最后一步,这样获得的数据是没有经过颜色类型转换的原生数据(比如灰度图像)。

https://blog.ibireme.com/2015/11/02/ios_image_tips/

最新文章

  1. MongoDB数据实体中的ObjectId序列化成json的一个小坑
  2. Docket学习--Docker入门
  3. http执行过程分析
  4. Errore Http 404.2
  5. 【ubuntu java】java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
  6. PfSense基于BSD的软件防火墙的安装、配置与应用
  7. javascirpt怎样模仿块级作用域(js高程笔记)
  8. Java Web EL JSTL的用法
  9. Java加载资源文件的两种方法
  10. Layout 不可思议(一)—— CSS 实现自适应的正方形卡片
  11. Oracle查询优化改写--------------------给查询结果排序
  12. HTML常用知识点代码演示
  13. pip freeze 打包依赖库及setup.py
  14. flex 1与flex auto
  15. csharp: Configuring ASP.NET with Spring.NET and FluentNHibernate
  16. 将本地的代码推送到公网的github账号去
  17. SPOJ 694 Distinct Substrings(不相同子串个数)
  18. springboot项目中报错:listener does not currently know of SID given in connect descriptor
  19. php获取ios或android通过文件头(header)传过来的坐标,通过百度接口获取具体城市和地址,并存入到session中。
  20. XMPPFrameWork IOS 开发(四)消息和好友上下线

热门文章

  1. SpringMVC(三)@PathVariable
  2. ubuntu区域语言(locale)设置(切换为中文)
  3. 版本控制之git学习
  4. jquery-ui实现拖拽功能
  5. UEditor如何读取数据库信息?
  6. 原生ajax的get和post方法封装
  7. 训练1-D
  8. 字符识别Python实现 图片验证码识别
  9. Google NewSQL之Spanner
  10. BA-siemens-insight使用问题汇总