iOS 正确选择图片加载方式
正确选择图片加载方式能够对内存优化起到很大的作用,常见的图片加载方式有下面三种:
//方法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 正确选择图片加载方式相关推荐
- 不一样的图片加载方式
在浏览网页的过程中,图片最容易吸引用户的注意力,它即能给用户直观感受,又能清晰地表达意图,所以在制作网页时,如何快速有效地加载图片资源显得尤为重要. 常见的图片加载方式 一般而言,最常见的图片加载方式 ...
- wpfのuri(让你完全明白wpf的图片加载方式以及URI写法)
原文:wpfのuri(让你完全明白wpf的图片加载方式以及URI写法) 绝对 pack WPF URI pack://application:,,,/是协议:",,,"是" ...
- React Native 的图片加载方式
在做APP的时候,遇到了要加载图片的问题,本来以为很简单,,但是知道真相的我眼泪掉下来.在此记录一下.. 一.本地图片的加载 如上图:./代表当前文件,相当于是在本地项目根据目录找到该图片即可.问题是 ...
- iOS开发:图片加载@2x与@3x
一.图片格式@2x与@3x 应对非视网膜和视网膜屏,APP有时会提供不同大小的图片,1倍图和2倍图和3倍图,它们的像素与1倍数图相比相差2倍或者3倍. 命名规则:2倍图在1倍图的名字后加 @2x 普通 ...
- android 图片加载方式
2019独角兽企业重金招聘Python工程师标准>>> //会缩放图片 BitmapDrawable drawable = (BitmapDrawable)getResources( ...
- 坑:Android从相册中选择图片加载到ImageView中显示不出
- 浅谈图片加载:逐行扫描VS交错扫描
一,前言 最近在不断地扩充自己web开发的知识面,看得比较泛,难得五一假期就在学习之余实践一下,毕竟纸上得来终觉浅,况且"纸上"的不一定都对,之前看了一篇博客讲图片加载的,博主大概 ...
- Android图片加载库的封装实战
重磅更新 2017-02-16 2017-05-09 优化圆形图片加载 更新demo 前言 主流图片加载库的对比 Android-Universal-Image-Loader Picasso Glid ...
- Android图片加载神器之Fresco,基于各种使用场景的讲解
Fresco是Facebook开源Android平台上一个强大的图片加载库,也是迄今为止Android平台上最强大的图片加载库. 优点:相对于其他开源的第三方图片加载库,Fresco拥有更好的内存管理 ...
最新文章
- java类引用接口的注释_java – 在接口类型上使用注释有什么好处?
- HTC打算一条道走到黑,开始资助「脑后插管操作」
- 加速IE的Javascript的方法
- C++中? : 运算符的使用
- SpringCloud04 服务配置中心、消息总线、远程配置动态刷新
- 被江苏网警点名后 咪蒙发道歉信:公众号停更2个月 微博永久关停
- 清晰架构的 Go 微服务: 程序容器
- c# Aspose.Words插入饼图PieChart
- 软件测试 | APP测试 —— Appium 自动化测试框架的初识与学习要领
- 2008年最新姓氏排名
- 矩阵的符号用计算机怎么打,在Word文档中怎么打出矩阵的符号?
- 32位汇编ebp、ebp-4、ebp+4、ebp+8等含义
- xdp 程序如何挂载
- C++ COM组件编写初探
- No module named 'torchvision.ops'的解决办法
- App推广如何快速实现,这些方法能帮你
- string类型 的 push_back()
- 通过配置环境变量解锁win+r新玩法
- 终极版C语言(七)-尹成-专题视频课程
- 港府支持发展电竞 数码港内办电竞活动或免场租