path和imagepathNamed的区别

下次自动登录
现在的位置:
& 综合 & 正文
imageNamed/ imageWithContentsOfFile /imageWithData 的区别
imageNamed
1) [UIImage imageNamed:ImageName]
2) 在application bundle的顶层文件夹寻找相应名字的图象,找到后系统会把图像Cache到内存(对于同一个图像系统只会把它Cache到内存一次),如果再次要用同一图像,图像将从内部缓存而不是从资源中加载,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
3) 但是,如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。又如在使用Interface Builder建立界面时,如果直接拖动UIImageView
并设置image的图片名称,InterfaceBuilder 正是通过UIImage 类的imageName方法加载图片,图片被缓存,导致内存使用较大,且无法释放,即使release掉 UIImageView也无济于事。
4) 创建出的内存不可分页。
imageWithContentsOfFile
NSString *path = [[NSBundlemainBundle] pathForResource:@”icon” ofType:@”png”];
myImage = [UIImage imageWithContentsOfFile:path];
2).不为图像提供缓存,调用的时候去加载,推荐使用。
3).创建出的内存可分页
imageWithData
1). NSString *filePath = [[NSBundlemainBundle] pathForResource:fileName ofType:extension];
NSData *image = [NSData dataWithContentsOfFile:filePath];
[UIImage imageWithData:image]
2).不为图像提供缓存,从二进制数据创建,利用NSData方式加载时,图像会被系统以数据方式加载到。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。3).创建出的内存不可分页
&&&&推荐文章:
【上篇】【下篇】iOS 加载图片imageNamed 和imageWithContentsOfFile的区别 - 简书
iOS 加载图片imageNamed 和imageWithContentsOfFile的区别
imageNamed,其参数为图片的名字。这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。
例如:你需要在 一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图 像的时候,只会把图片指针指向同一块内存。正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。
例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。
imageWithContentsOfFile,其参数也是图片文件的路径。仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。
NSString *path = [[NSBuddle mainBuddle] pathForResource:@"resourceName" oftype@"resourceType"];
UIImage *image = [[UIImage imageWithContentsOfFile:path];
UIImage *image = [UIImage imageNamed:@"imageName"];
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
NSData *image = [NSData dataWithContentsOfFile:filePath];
UIImage *image = [UIImage imageWithData:image];
//or = [UIImage imageWithContentsOfFile:filePath];
每天进步一点点。。。在做 tomcat 小例子的时候,发现了这个问题,摘自官方文档
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
通过加载指定路径(全路径)中的文件,查找加载图像数据,从而生成并返回一个图形对象(或者 nil),但是仅仅是加载出图像的对象,并不缓存这个图形对象。
一般用法:
NSString *file = [[NSBundle mainBundle] pathForResource:name ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:file];
其实,仔细看,很显然,在文档里,官方是Creating New Images下面的方法介绍。仅仅是创建新图片对象。
imageNamed:inBundle:compatibleWithTraitCollection:
属于目录Cached Image Loading Routines下,是在包bundle中,通过匹配某特征(直接写图片名字即可),返回一个图像,饼把图缓存。
+ (UIImage *)imageNamed:(NSString *)name
inBundle:(NSBundle *)bundle
compatibleWithTraitCollection:(UITraitCollection *)traitCollection
参数分别是图片名字,图片在的包,用来描述希望生成的图的特征的集合。这三个参数的此方法是 IOS8的新特性!如果找不到匹配的就返回 nil。
成功生成图片对象之后,如果在内存里这个生成的图片缓存不存在了,那么这个方法还是会去磁盘或者其他资源里定位并加载这个图片数据,返回。故,缓存一直存在!
此方法属于线程不安全的!
这里要看下这个
UITraitCollection
这个类是视图管理器的一些特征、细节存储的集合类,比如比例,尺寸等,当视图控制器生成,那么这个集合也自动为这个视图控制器生成一个对象。当然,一些其他的类,比如 UIImage 类,也会拥有类似的功能去存相同的特征。
一个参数的
+ (UIImage *)imageNamed:(NSString *)name
返回的是图形对象(或者nil),且有缓存,如果这个图是第一次被加载,那么这个方法会去app 的主包里通过 name寻找这个图片。这也就是为什么,在往项目中拖拽图片素材时,通常看选择
1& Destination:&勾选
2& Folders:
的不同,那么使用的方法是受限制的。
因为选择第一项:生成的黄色文件夹(区分点),在Xcode中分文件夹,但是在Bundle中所有素材都在同一个文件夹下,开发效率很高,因此,不能出现文件重名的情况,可以直接使用[NSBundle
mainBundle]作为资源路径,效率高!可以使用[UIImage imageNamed:]加载图像。选择第二项:生成蓝色文件夹(特点),那么Xcode中分文件夹,Bundle中同样分文件夹,因此,可以出现文件重名的情况,那么需要在[NSBundle
mainBundle]的基础上拼接实际的路径,效率较差!且不能使用[UIImage imageNamed:]加载图像。
同样是线程不安全。
总得来说,使用大的图片,如果不是常用,那么用 imagewithcontentsoffile 方法,比较小的(比如图标),需要经常使用的,那么用后者,imageNamed 加载。内存常驻,效率高。不过,就如 tomcat 里,那么多图片,一起用 imagenamed 加载,很容易内存泄露,程序崩溃,还需要及时关闭动画,清除图片数组等措施。
暂时了解下,以后有新发现再看。
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:502370次
积分:17130
积分:17130
排名:第511名
原创:1206篇
转载:322篇
评论:13条
(1)(1)(2)(2)(5)(3)(3)(40)(218)(205)(180)(7)(1)(9)(1)(31)(41)(45)(27)(31)(11)(3)(37)(104)(60)(489)IOS学习(4)
imageNamed
1) [UIImage imageNamed:ImageName]
2) 在application bundle的顶层文件夹寻找相应名字的图象,找到后系统会把图像Cache到内存(对于同一个图像系统只会把它Cache到内存一次),如果再次要用同一图像,图像将从内部缓存而不是从资源中加载,这对于图像的重复利用是非常有优势的。例如:你需要在一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
3) 但是,如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。又如在使用Interface Builder建立界面时,如果直接拖动UIImageView
并设置image的图片名称,InterfaceBuilder 正是通过UIImage 类的imageName方法加载图片,图片被缓存,导致内存使用较大,且无法释放,即使release掉 UIImageView也无济于事。
4) 创建出的内存不可分页。
imageWithContentsOfFile
1).& NSString *path = [[NSBundlemainBundle] pathForResource:@”icon” ofType:@”png”];
&&&&& myImage = [UIImage imageWithContentsOfFile:path];
2).不为图像提供缓存,调用的时候去加载,推荐使用。
3).创建出的内存可分页
imageWithData
1). NSString *filePath = [[NSBundlemainBundle] pathForResource:fileName ofType:extension];
&&& NSData *image = [NSData dataWithContentsOfFile:filePath];
&&& [UIImage imageWithData:image]
2).不为图像提供缓存,从二进制数据创建,利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。
3).创建出的内存不可分页
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6855次
排名:千里之外
原创:11篇
(1)(2)(1)(1)(1)(3)(9)(1)IOS开发(125)
一、加载图片问题
UIImage image =&[UIImage imageNamed:imageFileName];
这种图片加载方式带有图片缓存的功能,使用这种方式加载图片后,图片会自动加入系统缓存中,并不会立即释放到内存。一些资源使程序中经常使用的图片资源,
使用这种方式会加快程序的运行减少IO操作,但对于项目中只用到一次的图片,如果采用这种方案加载,会增导致程序的内存使用增加。
以下为官方对此方法的解释说明:
imageNamed:
Returns the image object associated with the specified filename.
+ (UIImage *)imageNamed:( &*)
Parameters
The name of the file. If this is the first time the image is being loaded, the method looks for an image with the specified name in the application’s main bundle.
Return Value
The image object for the specified file, or nil&if the method could not find the specified image.
Discussion
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.
二、非缓存的加载方式
+ (UIImage *)imageWithContentsOfFile:(&*)path
&&&&&&&&&& NSString *path = [[NSBundle mainBundle] pathForResource:@&icon& ofType:@&png&];
&&&&&&&&&& UIImage *myImage = [UIImage imageWithContentsOfFile:path];
+ (UIImage *)imageWithData:(&*)data
三、何时使用imageNamed方法
1、采用imageNamed方法的图片加载情况
图片资源反复使用到,如按钮背景图片的蓝色背景,这些图片要经常用到,而且占用内存少
2、不应该采用的情况:
(1)图片一般只使用一次,如一些用户的照片资源
(2)图片资源较大,加载到内存后,比较耗费内存资源& &
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:150965次
积分:2505
积分:2505
排名:第13456名
原创:86篇
转载:109篇
(4)(1)(1)(17)(1)(1)(6)(43)(33)(60)(9)(19)}

我要回帖

更多关于 无法编辑imagepath 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信