UIImage 的imageWithContentsOfFile:path和imageNamed的区别

在做 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 加载,很容易内存泄露,程序崩溃,还需要及时关闭动画,清除图片数组等措施。

暂时了解下,以后有新发现再看。

时间: 2025-01-31 02:20:20

UIImage 的imageWithContentsOfFile:path和imageNamed的区别的相关文章

详解path和classpath的区别

详解path和classpath的区别 path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6.0_10\bin\javac TheClass.java.path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径:而java的各种操作命令是在其安装路径中的bin目录下,所以在path中设置了JDK

path与classpath的区别

1.path的作用     path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6.0_10\bin\javac TheClass.java.path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径:而java的各种操作命令是在其安装路径中的bin目录下,所以在path中设置了JDK的安装目录后就不用再把jav

path和classpath的区别

1.path path是给操作系统用的  path是用来搜索所执行的可执行文件路径的,如果执行的可执行文件不在当前目录下,那就会依次搜索path中设置的路径:而java的各种操作命令是在其安装路径中的bin目录下,所以在path中设置了JDK的安装目录后就不用再把java文件的完整路径写出来了,它会自动去path中设置的路径中去找:  2.classpath classpath是给Java用的 classpath是java专用的查找类的路径 参考资料:http://blog.csdn.net/m

os.path.abs()与os.path.realpath()的一点区别

相同点 1. 两者都是返回绝对路径,如果参数path为空,则返回当前文件所在目录的绝对路径 当前py文件所在的目录是revise print(os.path.abspath("")) print(os.path.realpath("")) 运行结果: D:\python_workshop\python6\revise D:\python_workshop\python6\revise 2. 如果给一个不存在的文件名作为相对路径的path,会将当前所在目录和文件名拼接

IOS 开发笔记-基础 UI(7)汤姆猫(UIImageView 的序列帧动画、图片加载,方法重构、Bundle 图片素材)

使用UIImageView.UIButton实现一个综合小案例---汤姆猫 回忆:UIImageView 来自UIView,UIView 来自UIResponder,UIButton 来自UIControl,UIControl 来自UIView 单独看实现,代码实现其实比较简单,但是创意很难得,美工要求很高! 是一个了不起的游戏! 功能分析 (1)点击对应的按钮后,让汤姆猫展现对应的动画 步骤分析 (1)搭建UI界面,同时也是准备素材 (2)监听按钮点击 (3)根据点击的按钮执行对应的动画 说明

imageNamed和imageWithContentsOfFile区别

在 Apple 官方帮助文档提供了两个加载图片的方法 imageNamed , 其参数为图片的名字 imageWithContentsOfFile , 其参数是图片文件的路径 下面主要是说一下他们的区别: imageNamed: 用这个方法加载图片分为两种情况: 系统缓存有这个图片 直接从缓存中取得 系统缓存没有这个图片 通过传入的文件名对整个工程进行遍历 (在application bundle的顶层文件夹寻找名字的图象 ), 如果如果找到对应的图片 , iOS 系统首先要做的是将这个图片放到

iOS 开发----imageNamed和imageWithContentsOfFile区别

在 Apple 官方帮助文档提供了两个加载图片的方法 imageNamed , 其参数为图片的名字 imageWithContentsOfFile , 其参数是图片文件的路径 下面主要是说一下他们的区别: imageNamed: 用这个方法加载图片分为两种情况: 系统缓存有这个图片 直接从缓存中取得 系统缓存没有这个图片 通过传入的文件名对整个工程进行遍历 , 如果如果找到对应的图片 , iOS 系统首先要做的是将这个图片放到系统         缓存中去,以备下次使用的时候直接从系统缓存中取

imageNamed 、imageWithContentsOfFile、 initWithContentsFile区别

[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用 用UIImage加载本地图像最常用的是下面三种: 1.用imageNamed方法 [UIImage imageNamed:ImageName]; 2.用 imageWithContentsOfFile 方法 NSString *thumbnailFile = [NSString stringWithFormat:@"%@/%@.png", [[NSBundle mainBundle

imageNamed 与 imageWithContentsOfFile的区别

如题,是不是大家为了方便都这样加载图片啊 myImage = [UIImage imageNamed:@"icon.png"]; 那么小心了 这种方法在一些图片很少,或者图片很小的程序里是ok的. 但是,在大量加载图片的程序里,请千万不要这样做. 为什么呢 ??????? 这种方法在application bundle的顶层文件夹寻找由供应的名字的图象 . 如果找到图片,装载到iPhone系统缓存图象.那意味图片是(理论上)放在内存里作为cache的. 试想你图片多了,是什么后果```