正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种:

//方法1
UIImage *imag1 = [UIImage imageNamed:@"image.png"];
//方法2
UIImage *image2 = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]];
//方法3
NSData *imageData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image.png" ofType:nil]];
UIImage *image3 = [UIImage imageWithData:imageData];

第一种方法:imageNamed:

  为什么有两种方法完成同样的事情呢?imageNamed的优点在于可以缓存已经加载的图片。苹果的文档中有如下说法:

  This method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.

  这种方法会首先在系统缓存中根据指定的名字寻找图片,如果找到了就返回。如果没有在缓存中找到图片,该方法会从指定的文件中加载图片数据,并将其缓存起来,然后再把结果返回。对于同一个图像,系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。

  然而,正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。

第二种方法和第三种方法本质是一样的:imageWithContentsOfFile:和imageWithData:

imageWithContentsOfFile:仅加载图片,图像数据不会缓存,图像会被系统以数据方式加载到程序。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。

下面列举出两种方法的详细用法:

NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
UIImage *image = [UIImage imageWithContentsOfFile:path];

以及:

NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
NSData *image = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];

如果加载一张很大的图片,并且只使用一次,那么就不需要缓存这个图片。这种情况imageWithContentsOfFile比较合适,系统不会浪费内存来缓存图片。
然而,如果在程序中经常需要重用的图片,那么最好是选择imageNamed方法。这种方法可以节省出每次都从磁盘加载图片的时间。

  

转载于:https://www.cnblogs.com/Mr-Lin/p/5802745.html

iOS 正确选择图片加载方式相关推荐

  1. 不一样的图片加载方式

    在浏览网页的过程中,图片最容易吸引用户的注意力,它即能给用户直观感受,又能清晰地表达意图,所以在制作网页时,如何快速有效地加载图片资源显得尤为重要. 常见的图片加载方式 一般而言,最常见的图片加载方式 ...

  2. wpfのuri(让你完全明白wpf的图片加载方式以及URI写法)

    原文:wpfのuri(让你完全明白wpf的图片加载方式以及URI写法) 绝对 pack WPF URI pack://application:,,,/是协议:",,,"是" ...

  3. React Native 的图片加载方式

    在做APP的时候,遇到了要加载图片的问题,本来以为很简单,,但是知道真相的我眼泪掉下来.在此记录一下.. 一.本地图片的加载 如上图:./代表当前文件,相当于是在本地项目根据目录找到该图片即可.问题是 ...

  4. iOS开发:图片加载@2x与@3x

    一.图片格式@2x与@3x 应对非视网膜和视网膜屏,APP有时会提供不同大小的图片,1倍图和2倍图和3倍图,它们的像素与1倍数图相比相差2倍或者3倍. 命名规则:2倍图在1倍图的名字后加 @2x 普通 ...

  5. android 图片加载方式

    2019独角兽企业重金招聘Python工程师标准>>> //会缩放图片 BitmapDrawable drawable = (BitmapDrawable)getResources( ...

  6. 坑:Android从相册中选择图片加载到ImageView中显示不出

  7. 浅谈图片加载:逐行扫描VS交错扫描

    一,前言 最近在不断地扩充自己web开发的知识面,看得比较泛,难得五一假期就在学习之余实践一下,毕竟纸上得来终觉浅,况且"纸上"的不一定都对,之前看了一篇博客讲图片加载的,博主大概 ...

  8. Android图片加载库的封装实战

    重磅更新 2017-02-16 2017-05-09 优化圆形图片加载 更新demo 前言 主流图片加载库的对比 Android-Universal-Image-Loader Picasso Glid ...

  9. Android图片加载神器之Fresco,基于各种使用场景的讲解

    Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理 ...

最新文章

  1. java类引用接口的注释_java – 在接口类型上使用注释有什么好处?
  2. HTC打算一条道走到黑,开始资助「脑后插管操作」
  3. 加速IE的Javascript的方法
  4. C++中? : 运算符的使用
  5. SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
  6. 被江苏网警点名后 咪蒙发道歉信:公众号停更2个月 微博永久关停
  7. 清晰架构的 Go 微服务: 程序容器
  8. c# Aspose.Words插入饼图PieChart
  9. 软件测试 | APP测试 —— Appium 自动化测试框架的初识与学习要领
  10. 2008年最新姓氏排名
  11. 矩阵的符号用计算机怎么打,在Word文档中怎么打出矩阵的符号?
  12. 32位汇编ebp、ebp-4、ebp+4、ebp+8等含义
  13. xdp 程序如何挂载
  14. C++ COM组件编写初探
  15. No module named 'torchvision.ops'的解决办法
  16. App推广如何快速实现,这些方法能帮你
  17. string类型 的 push_back()
  18. 通过配置环境变量解锁win+r新玩法
  19. 终极版C语言(七)-尹成-专题视频课程
  20. 港府支持发展电竞 数码港内办电竞活动或免场租

热门文章

  1. WinLaucher启动
  2. OpenCV cv2.putText实现字符串换行'\n'
  3. 监控工具—Prometheus—基础介绍
  4. 从最基础的讲起如何做到均匀的生成随机数
  5. CF662C Binary Table
  6. Java对象序列化为什么要使用SerialversionUID
  7. python下selenium测试报告整合
  8. Android 每天定时提醒功能实现
  9. 字符串和数字之间的转化
  10. Silverlight 多窗口的实现.