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. 【转】Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个 ...

  2. jae.jd

    免费好用的web应用托管平台   1.前言 曾经很久以前,想找一个免费的空间部署一个属于自己的技术博客真是太难了,使用过SAE,但是很快就面临收费了,后面也就不了了之了.目前自己又找到一个免费的PAA ...

  3. [置顶] c# 验证码生成

    今儿有一个任务是输出一串字符,要求用GDI画出于是: Bitmap bm = new Bitmap(200, 200);             Graphics g = Graphics.FromI ...

  4. VS2012 Unit Test

    VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...

  5. IOS学习之路五(SpriteKit 开发飞机大战小游戏一)

    参考SpriteKit 创建游戏的教程今天自己动手做了一下,现在记录一下自己怎么做的,今天之做了第一步,一共有三个部分. 第一步,项目搭建. 项目所用图片资源:点击打开链接 1.在Xcode打开之后, ...

  6. SharePoint RBS 安装(集成Office Web Apps)

    前言 本文完全原创,转载请说明出处,希望对大家有用. 本篇博客是个人总结,一方面以便日后查看,另一方面希望能为其他人提供一些便利. 阅读目录 安装RBS 为多个内容数据库开启RBS 正文 目的:在Sh ...

  7. 简单的mvc之三:灵活的路由(上)

    在上一篇关于管线的随笔中已经提及了管线,通过对管线的分析,我们可以得到下面几个结论:路由系统由URLRoutingModule模块实现,它订阅了PostResolvRequestCache事件:路由系 ...

  8. 【转】Install Oracle Jdbc driver in your Maven local repository

    Install Oracle Jdbc driver in your Maven local repository If you are using Oracle, you must first in ...

  9. CSS3 3D笨蛋教程

    英文原文An Introduction to CSS 3-D Transforms 爱因斯坦说所有概念都必须介绍给儿童们,若他们无法了解,这些理论就毫无价值. 透视 一个元素需要一个透视点才能激活3D ...

  10. MongoDB深圳用户组线下活动召集

    MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动.目前全球有100多个MongoDB用户组,3万5千多爱好者参与.用户组活动的形式通常会有一到两个MongoDB相关的技术 ...