iOS 加载Image的两种方式
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的两种方式的更多相关文章
- WebView加载页面的两种方式——网络页面和本地页面
WebView加载页面的两种方式 一.加载网络页面 加载网络页面,是最简单的一种方式,只需要传入http的URL就可以,实现WebView加载网络页面 代码如下图: 二.加载本地页面 1.加载asse ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)
接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二 ...
- [Android] Android ViewPager 中加载 Fragment的两种方式 方式(一)
Android ViewPager 中加载 Fragmenet的两种方式 一.当fragment里面的内容较少时,直接 使用fragment xml布局文件填充 文件总数 布局文件:view_one. ...
- 前端实现图片懒加载(lazyload)的两种方式
在实际的项目开发中,我们通常会遇见这样的场景:一个页面有很多图片,而首屏出现的图片大概就一两张,那么我们还要一次性把所有图片都加载出来吗?显然这是愚蠢的,不仅影响页面渲染速度,还浪费带宽.这也就是们通 ...
- easyui datagrid加载数据的两种方式
1.加载本地数据 var obj = {"total":2,"rows":[{id:"1",name:"一"},{id: ...
- mybatis 加载配置文件的两种方式
package com.atguigu.day03_mybaits.test; import java.io.IOException;import java.io.InputStream;import ...
- easyui里面的加载tree的两种方式
第一种: 使用EasyUI中Tree 符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ "id":1, "text":"My ...
- JavaScript判断图片是否加载完成的三种方式
JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
随机推荐
- 【转】Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9671609 记得在很早之前,我写了一篇关于Android滑动菜单的文章,其中有一个 ...
- jae.jd
免费好用的web应用托管平台 1.前言 曾经很久以前,想找一个免费的空间部署一个属于自己的技术博客真是太难了,使用过SAE,但是很快就面临收费了,后面也就不了了之了.目前自己又找到一个免费的PAA ...
- [置顶] c# 验证码生成
今儿有一个任务是输出一串字符,要求用GDI画出于是: Bitmap bm = new Bitmap(200, 200); Graphics g = Graphics.FromI ...
- VS2012 Unit Test
VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...
- IOS学习之路五(SpriteKit 开发飞机大战小游戏一)
参考SpriteKit 创建游戏的教程今天自己动手做了一下,现在记录一下自己怎么做的,今天之做了第一步,一共有三个部分. 第一步,项目搭建. 项目所用图片资源:点击打开链接 1.在Xcode打开之后, ...
- SharePoint RBS 安装(集成Office Web Apps)
前言 本文完全原创,转载请说明出处,希望对大家有用. 本篇博客是个人总结,一方面以便日后查看,另一方面希望能为其他人提供一些便利. 阅读目录 安装RBS 为多个内容数据库开启RBS 正文 目的:在Sh ...
- 简单的mvc之三:灵活的路由(上)
在上一篇关于管线的随笔中已经提及了管线,通过对管线的分析,我们可以得到下面几个结论:路由系统由URLRoutingModule模块实现,它订阅了PostResolvRequestCache事件:路由系 ...
- 【转】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 ...
- CSS3 3D笨蛋教程
英文原文An Introduction to CSS 3-D Transforms 爱因斯坦说所有概念都必须介绍给儿童们,若他们无法了解,这些理论就毫无价值. 透视 一个元素需要一个透视点才能激活3D ...
- MongoDB深圳用户组线下活动召集
MongoDB线下用户组是由全世界MongoDB爱好者发起的不定期线下交流活动.目前全球有100多个MongoDB用户组,3万5千多爱好者参与.用户组活动的形式通常会有一到两个MongoDB相关的技术 ...