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 ...
随机推荐
- SZU:G32 Mass fraction
Judge Info Memory Limit: 32768KB Case Time Limit: 5000MS Time Limit: 5000MS Judger: Float Numbers (1 ...
- JobTracker等相关功能模块初始化
[Hadoop代码笔记]Hadoop作业提交之JobTracker等相关功能模块初始化 一.概要描述 本文重点描述在JobTracker一端接收作业.调度作业等几个模块的初始化工作.想过模块的介绍会在 ...
- 2013集训.DAY21.A
随便点了一套刷,这套质量挺棒的,学了不少的东西,并且碰到了很久都没有打的题目 T1 card [指针技巧] 题1 集卡片 [问题描述] lzh小时候很喜欢收集卡片,他经常要去商店购买新到的卡片. 商店 ...
- C/C++基础知识总结——多态性
1. 多态性的概述 1.1 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对垒的成员函数的调用,不同行为是指不同的实现. 1.2 多态的实现 (1) 实现角度讲多态可分为两类:编 ...
- [转]Native Java Bytecode Debugging without Source Code
link from:http://www.crowdstrike.com/blog/native-java-bytecode-debugging-without-source-code/index.h ...
- 【C#】聊聊不需要记密码的密码管理
密码管理(Password Management)肯定所有人都不会陌生,密码管理的来源也是来自于实际需求,当人们需要使用到密码的场景越来越多,场景也越来越复杂,密码的记录就成为了“难题”和“负担”,很 ...
- SQLSERVER到底能识别多少个逻辑CPU?
SQLSERVER到底能识别多少个逻辑CPU? SQLSERVER到底能识别多少个逻辑CPU? 前言 在前几天在论坛有人遇到SQLSERVER识别逻辑CPU的问题 帖子地址: http://socia ...
- RDLC(Reportview)报表
你还可以再诡异点吗——SQL日志文件不断增长 前言 今天算是遇到了一个罕见的案例. SQL日志文件不断增长的各种实例不用多说,园子里有很多牛人有过介绍,如果我再阐述这些陈谷子芝麻,想必已会被无数次 ...
- nginx-push-stream模块源码学习(三)——发布
一.概述 发布:发布者将MSG post到某一特定通道上,channel将信息缓存 在说明发布流程之前有必要说明下channel和msg的数据结构. 二.数据结构 2.1 MSG 发布 ...
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...