总结一下UIImage的内存使用及管理

用UIImage加载图像的方法很多,最常用的是下面两种:

1.用imageNamed函数

[UIImage imageNamed:ImageName];

2.用NSData的方式加载,例如:

NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:extension]; NSData *image = [NSData dataWithContentsOfFile:filePath]; [UIImage imageWithData:image];

由于第一种方式要写的代码比较少,可能比较多人利用imageNamed的方式加载图像。其实这两种加载方式都有各自的特点。

1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。

2)利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。

无论用哪种方式加载图像,图像使用结束后,一定要记得显示释放内存。

所以当程序要加载大量图片时应尽量使用第二种方法。

来回加载大量图片内存溢出的问题相关推荐

  1. Android加载图片内存溢出问题解决方法

    这篇文章主要介绍了Android加载图片内存溢出问题解决方法,本文讲解使用BitmapFactory.Options解决内存溢出问题,需要的朋友可以参考下 1. 在Android软件开发过程中,图片处 ...

  2. android加载大量图片内存优化,Android图片加载内存优化

    利用BitmapFactory.Options实现图片内存优化 通过设置options.inPreferredConfig控制内存占用 首先准备了一张1280x800的blue_bg.png图片,我们 ...

  3. 加载大量图片内存暴增导致闪退 Terminated due to memory issue(内存暴增SDWebImage加载高清大图崩溃)

    上传图片一定要压缩,一定要压缩,一定要压缩.(目前手机拍摄的图片一张几M,上传后不压缩,如果几十张一块加载展示时内存画面有点美!如果是后台上传除了需要高清以外的图也需要压缩处理) 下载大量图片时一定要 ...

  4. c# 未能加载文件或程序集mysql.data,c# - 当我未引用文件或程序集Oracle.ManageddataAccess时,它无法加载 - 堆栈内存溢出...

    我不断 System.IO.FileNotFoundException:'无法加载文件或程序集'Oracle.ManagedDataAccess,Version = 4.122.1.0,Culture ...

  5. Fresco加载图片内存占用过大导致OOM

    Fresco加载网络图片部分设备出现显示部分图片为黑色并崩溃 1.在使用Fresco显示网络图片在天猫魔盒M17设备时,出现部分图片显示为黑色,且一段时间后程序崩溃. 尝试把setImageURI方法 ...

  6. 把 mysql 整个加载进内存磁盘中_MySQL 缓冲池 是什么?

    Mysql 中数据是要落盘的,这点大家都知道.读写磁盘速度是很慢的,尤其和内存比起来更是没的说.但是,我们平时在执行 SQL 时,无论写操作还是读操作都能很快得到结果,并没有预想中的那么慢. 可能你会 ...

  7. c语言文件 加载内存吗,把文件中的数据加载到内存进行查找C语言实现.docx

    把文件中的数据加载到内存进行查找C语言实现 #define _CRT_SECURE_NO_WARNINGS#include#include#includechar **pp=NULL;void ini ...

  8. tflearn 数据集太大无法加载进内存问题?——使用image_preloader 或者是 hdf5 dataset to deal with that issue...

    tflearn 数据集太大无法加载进内存问题? Hi, all! I'm trying to train deep net on a big dataset that doesn't fit into ...

  9. 可执行程序加载到内存的过程

    在linux中,程序的加载,涉及到两个工具,linker 和loader.Linker主要涉及动态链接库的使用,loader主要涉及软件的加载. 1.  exec执行一个程序 2.  elf为现在非常 ...

最新文章

  1. SAP EWM - 其他主数据 - 承运方
  2. python---骰子游戏
  3. 设备 esp32_ESP32-S2 SoC、模组、开发板全面上市
  4. 系统固件升级_固件和操作系统之间的差异
  5. vscode markdown_VS Code中的Markdown插件
  6. 开方计算与浮点数的问题
  7. 安装Oracle 11.2.0
  8. 基于Go调用国密SM2算法
  9. 合并两个有序数组-c语言
  10. 一张图,讲明白UML类图
  11. win7程序关闭后弹出 程序兼容性助手 这个程序可能安装不正确 如果此程序没有正确安装,处理方式
  12. 程序员如何使正确卖出自己的程序但是不想被人知道代码的具体实现?
  13. python地产成本_Python3抓取 深圳房地产均价数据,通过真实数据为购置不动产做决策分析(二)...
  14. H3c Smart-link 实验
  15. html浏览器标题闪动,一个网页标题title的闪动提示效果实现思路
  16. UE4 安装及入门项目
  17. 小程序一个简单的订单界面
  18. 蓝桥杯-Sine之舞-java
  19. 【DSP】理解并用MATLAB手动实现unwrap()
  20. 奥巴马胜选演说·文言版

热门文章

  1. 王哲在Facebook高管午餐会的访谈实录
  2. 如何学习好游戏建模?游戏建模多要用到一些什么?
  3. 魅族手机sim卡无显示无服务器,【点击查看】非魅族手机如何登Flyme帐号玩游戏?...
  4. ES6 Set 和 Map 遍历操作
  5. APP开发外包注意事项
  6. 【数据结构】——快排详解
  7. sqlserver调用mysql存储过程_sqlserver里存储过程怎么调用存储过程
  8. HR如何通过数据分析来提升人效?
  9. 网络中链路复用的优缺点及交换机作用分析
  10. 推荐一款免费无套路的谷歌影像下载器