imageNamed 、imageWithContentsOfFile、 initWithContentsFile区别
[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用
用UIImage加载本地图像最常用的是下面三种:
1.用imageNamed方法
[UIImage imageNamed:ImageName];
2.用 imageWithContentsOfFile 方法
NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle] resourcePath], fileName];
UIImage *thumbnail = [UIImage imageWithContentsOfFile:thumbnailFile];
3. 用initWithContentsFile方法
UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath]
第一种方法为常见方法,利用它可以方便加载资源图片。用imageNamed的方式加载时,会把图像数据根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。而且没有明确的释放方法。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存。
第二种方法加载的图片是不会缓存的。得到的对象时autoRelease的,当autoReleasePool释放时才释放。
第三种方法要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。
用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的 内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一 个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
UIImage常用的加载图片有3种方式: imageNamed , imageWithContentsOfFile , initWithContentsFile .
imageNamed:
UIImage image = [UIImage imageNamed:@"image.gif"] . 得到的对象是autoRelease的。这个方法有点特殊,它在生成image对象的同时,会把图像数据 根据它的名字缓存在系统内存中,以提高imageNamed方法获得相同图片的image对象的性能。即使生成的对象被 autoReleasePool释放了,这份缓存也不释放。这对与在应用中有大量相同图片时,非常有用,可以提高性能和内存利用率。
imageWithContentsOfFile :
UIimage image = [UIImage imageWithContentsOfFile:@"path"] 。得到的对象时autoRelease的,当autoReleasePool释放时才释放。不系统缓存。
initWithContentsFile
UIimage image = [[UIImage alloc] init initWithContentsFile] 。 的到的对象没用后,要手动release掉。不系统缓存。release后立即释放,一般用在封面等图比较大的地方。
使用imageNamed方式,用同一张图片贴多个imageView应该是经过极大的优化,耗时和内存都极小,而使用imageWithContentsOfFile则有巨大消耗:
生成的UIImage对象内存地址 生成10万个相同文件名 使用相同文件名的185
的UIImage对象的内 个 UIImageView对象
存 及耗时 进行贴图
内存:28.70M->32.90M 内存:29.69M-32.84M
imageNamed方式 同一个内存地址 耗时:瞬时 耗时:瞬时
imageWith 内存:29.38M->300.96M 内存:30.21M->537.57M
ContentsOfFile 各不相同的内存地址 耗时:30秒 耗时:40秒以上
用UIImage加载图像的方法很多,最常用的是下面两种:
1、用imageNamed函数
[UIImage imageNamed:ImageName];
2、用NSData的方式加载,例如:
1. NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
2. NSData *image = [NSData dataWithContentsOfFile:filePath];
3. [UIImage imageWithData:image];
由于第一种方式要写的代码比较少,可能比较多人利用imageNamed的方式加载图像。其实这两种加载方式都有各自的特点。
1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的 内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一 个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
2)利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。
无论用哪种方式加载图像,图像使用结束后,一定要记得显示释放内存。
imageNamed 、imageWithContentsOfFile、 initWithContentsFile区别的更多相关文章
- imageNamed 与 imageWithContentsOfFile的区别
如题,是不是大家为了方便都这样加载图片啊 myImage = [UIImage imageNamed:@"icon.png"];那么小心了这种方法在一些图片很少,或者图片很小的程序 ...
- iOS imageNamed 与 imageWithContentsOfFile 的区别
imageNamed 方法 1)后面的参数是icon的名字,图片可以存在项目中,也可以存在Asset中 2)该方法只适合一些中小型的图片读取,而一些比较大的资源图片并不适合用这个方法 3)这个方法加载 ...
- imageNamed 与 initWithContentsOfFile 区别
1.imageNamed: UIImage *image = [UIImage imageNamed:"]; UIImage的类方法 第一次读取图片的时候,先把这个图片放到缓存中,下次再使用 ...
- initWithImage和imageWithContentsOfFile的区别
UIImageView *imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"icon ...
- iOS两种方式加载图片的区别
加载图片的方式: imageNamed: imageWithContentsOfFile: 加载Assets.xcassets这里面的图片: 1> 打包后变成Assets.car 2> 拿 ...
- iOS开发——UI基础-UIImage,UIImageView的使用
1.UIImage 创建UIImage的两种方法 UIImage *image = [UIImage imageNamed:imageNmae]; UIImage *image = [UIImage ...
- UISCREEN 和支持高分辨率的显示屏
UIScreen对象包含了整个屏幕的边界矩形.当构造应用的用户界面接口时,你应该使用该对象的属性来获得推荐的矩形大小,用以构造你的程序窗口. CGRect bound = [[UIScreen mai ...
- IOS开发中@2x图片等适应不同分辨率手机
开发中,例如: nanshanImage.image=[UIImage imageNamed:@'index_pic.png']; 在项目中还保存中index_pic@2x.png的图片,此图为了只适 ...
- iOS 2x 3x
iOS中: 备注: Retina是一种显示技术,可以将把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度.而其最初该技术是用于苹果的iPhone4上.其屏幕分辨率为960×6 ...
随机推荐
- [SQLite] SQLite学习手册(数据库和事务)
转载地址:http://www.cnblogs.com/stephen-liu74/archive/2012/02/18/2322575.html 一.Attach数据库: ATTACH DATABA ...
- Configuring HDFS High Availability
Configuring HDFS High Availability 原文请訪问 http://blog.csdn.net/ashic/article/details/47024617,突袭新闻小灵儿 ...
- how to configure logback for Mybatis to print my SQL
To log SQL statements for particular mybatis mapper set DEBUG (TRACE to see query parameters and res ...
- 混沌数学之Henon吸引子
Henon吸引子是混沌与分形的著名例子. 相关软件:混沌数学及其软件模拟相关代码: // http://wenku.baidu.com/view/d51372a60029bd64783e2cc0.ht ...
- UVA 10474 (13.08.04)
Where is the Marble? Raju and Meena love to play with Marbles. They have got a lotof marbles with ...
- WebView 加载网页 加载资源 总结 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 给开发者准备的 10 款最好的 jQuery 日历插件[转]
这篇文章介绍的是 10 款最棒而且又很有用的 jQuery 日历插件,允许开发者们把这些漂亮的日历插件结合到自己的网站中.这些日历插件易用性都很强,轻轻松松的就可以把漂亮的日历插件装饰到你的网站了.希 ...
- 超酷的响应式dribbble设计作品瀑布流布局效果
相信做设计的朋友肯定都知道dribbble.com,它是一个非常棒的设计师分享作品的网站,全世界数以万计的设计高手和行家都在这个网站上分享自己的作品,当然,如果你常在上面闲逛的话,经常得到一些免费的好 ...
- 时间插件WdatePicker使用方法
只需要引入js文件即可: <script src="WdatePicker/WdatePicker.js"></script> 自己试了个小实例: < ...
- Learning How To Code Neural Networks
原文:https://medium.com/learning-new-stuff/how-to-learn-neural-networks-758b78f2736e#.ly5wpz44d This i ...