Apple官方文档对于加载image提供了两个方法

+ (nullable UIImage *)imageNamed:(NSString *)name;

+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;

那么这两个方法对于加载图片有什么区别呢,下面我们用序列帧动画来演示这两个方法的区别:

这个程序一共加载了三组序列帧动画:

首先我们使用+ (nullable UIImage *)imageNamed:(NSString *)name;来加载图片

当我们把程序运行起来的时候,看下程序内存:

当我点击第一组的时候,看下内存

接下来,我继续点击第二组,播放第二组序列帧的动画

接下来我点击第三组,播放第三组序列帧动画

那么我们接下来分析内存是为什么增长到这么多,而且当程序运行的时候一直不会释放掉

当执行self.imageView.animationImages = nmArray;就会对数组进行强引用,从而数组里面的内容不会被释放。所以图片就会一直在内存中不会被释放掉。

当时当我点击另外一组序列帧图片的时候,这个数组会指向另外一组图片,那么以前指向的图片应该就会被释放掉了。如果是这样的话,内存不会持续增涨,而是当前数组

指向的一组图片的内存大小而已。实际现象是这个内存是一直增涨的,所以当animationImages这个指针指向别的图片数组时,它以前指向的图片数组并没有在内存中释放,

而是放到了缓存区中。才会造成内存一直增涨,图片不会被释放。很显然,我们希望数组指向另外一个图片数组的时候,要把以前指向的图片数组释放掉,从而释放内存。

这里就涉及到两种加载图片的方法的区别了。接下来我们来看一下用+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;这种方式来加载图片,

再次看一下内存效果

只是换了一种图片加载方式,别的代码没有做任何改动。接下来看一下内存

同样当我点击第一组序列帧的时候,

当我点第二组序列帧动画时:

当我点击第三组图片的时候:

这两种加载图片的方法的区别 ,在内存方面 ,看起来就显而易见了。

那么这两种加载图片的方式到底存在着怎么样的区别呢。上面我们说了,当使用+ (nullable UIImage *)imageNamed:(NSString *)name这种方式加载图片时,当

图片没有指针指向的时候,并不会被释放掉,而是放在了缓存区中,所以内存就会一直增加。而使用+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path

这种方式加载图片的时候,当图片没有指针指向的时候,就会被释放掉。所以内存就不会一直增加。

那么,这两种加载图片的方法,要看不同的情景。当图片会被多次使用的时候,并且图片比较小的时候,我们就使用+ (nullable UIImage *)imageNamed:(NSString *)name

这种方式加载,因为图片被缓存的缓存区的时候,下一次再使用该图片的时候,加载的效率就会提高了。当图片不经常使用,并且图片比较大的时候,就使用+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path这种方式加载,当图片使用完毕,直接释放掉。因为图片基本不会被重复使用,用户很少对一组序列帧动图看好几次吧。

通过内存的对比,这两种加载图片的区别就显而易见了。

接下来,还有一个小问题,就是当一组序列帧播放完毕的时候,如果不点击别的序列帧动画,这个数组就一直会指向这个图片数组。那么就会导致最后一组序列帧图片不会被释放,

一直有强指针指向。

这个时候序列帧动画播放完毕了,而内存还一直是280M,所以当序列帧动画播放完毕的时候,我们要把self.imageView.animationImages这个指针指向Nil.从而释放掉图片

这样,对于序列帧动画的内存问题就已经全部解决了。

总结:当对于图片要经常使用的时候,并且图片比较小,我们就使用imageName方式加载,比如tableViewCell里面的小图标之类的,或者按钮图片。

当图片不经常使用的时候,就使用ImageWithContentOfFile来加载,图片使用结束以后,直接释放掉,没有必要再继续占内存了。比如 序列帧动画

iOS 加载Image的两种方式的更多相关文章

  1. WebView加载页面的两种方式——网络页面和本地页面

    WebView加载页面的两种方式 一.加载网络页面 加载网络页面,是最简单的一种方式,只需要传入http的URL就可以,实现WebView加载网络页面 代码如下图: 二.加载本地页面 1.加载asse ...

  2. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

    接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...

  3. [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)

    Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...

  4. 前端实现图片懒加载(lazyload)的两种方式

    在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通 ...

  5. easyui datagrid加载数据的两种方式

    1.加载本地数据 var obj = {"total":2,"rows":[{id:"1",name:"一"},{id: ...

  6. mybatis 加载配置文件的两种方式

    package com.atguigu.day03_mybaits.test; import java.io.IOException;import java.io.InputStream;import ...

  7. easyui里面的加载tree的两种方式

    第一种: 使用EasyUI中Tree 符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ "id":1, "text":"My ...

  8. JavaScript判断图片是否加载完成的三种方式

    JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...

  9. Vue加载组件、动态加载组件的几种方式

    https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...

随机推荐

  1. J2EE总结(2)——Servlet/JSP

    Servlet/JSP Servlet定义:部署在java的Webserver上的组件.整个java服务端程序都构建在Servlet之上,以多线程方式提 供服务,具有效率高.可扩展,可移植的特点. J ...

  2. Unit of work + Repository

    (Unit of work + Repository) 今日后开启进阶模式! 谈到MVC与EntityFramework,则不得不说一说事务与仓储(Unit of work + Repository) ...

  3. Oracle琐碎笔记2

    备注:以下所有操作均在sqlplus中执行. 开始前输入:spool c:\jiyi.txt;结束后输入:spool off;就会记忆操作的所有记录save c:\sql.sql;保存sql脚本可以使 ...

  4. AgileEAS.NET SOA中间件平台/敏捷软件开发平台

    AgileEAS.NET SOA中间件平台/敏捷软件开发平台 最新下载 一.前言 AgileEAS.NET SOA中间件平台,简称EAS.NET,是基于敏捷并行开发思想和Microsoft .Net构 ...

  5. DedeCms密码解密[转]

    dede 的密码怎么破解,dede后台.32位的DEDE密码如何破解 dede 的密码是32位MD5减去头5位,减去尾七位,得到20 MD5密码,方法是,前减3后减1,得到16位MD5. 比如我的数据 ...

  6. UNIX系统接口

    UNIX系统接口 8.1 文件描述符 UNIX操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统中的文件.系统通过文件描述符来标识文件:标准输入为0,标准输出为1,标准错误为2. 当程序 ...

  7. 字符串比较strcmp

    问题: 原型:extern int strcmp(const char *s1,const char * s2); 所在头文件:string.h 功能:比较字符串s1和s2. 一般形式:strcmp( ...

  8. Android 下载模块分析(DownloadManager和DownloadProvider)

    Android下载模块主要有2个部分组成:DownloadManager和DownloadProvider:其中DownloadManager提供接口供调用,具体的实现是 DownloadProvid ...

  9. 仿腾讯微博的一个弹出框 v0.1 beta

    仿腾讯微博的一个弹出框 v0.1 beta   代码写的不太好,新手请大家海涵,只为博君一笑,勿放在心上. 写在这里留作纪念,也许以后用的到. 效果 CSS .prompt{ position: ab ...

  10. mssql server 函数大全

    一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘'括起来,但含其它字符的字符串必须用‘'括起来使用,否则会出错.2.CHAR ...