imageWithName与imageWithContentsOfFile
一 图片加载有以下两种方式:
+(UIImage*)imageNamed:(NSString*)name
+(UIImage*)imageWithContentsOfFile:(NSString*)name
两种方式有何区别,在查阅官方文档后发现以下解释:
imageNamed:在加载图片时会根据名字在主目录中查找,首先会在内存缓存中查找,如果没有再从磁盘获取,之后系统会缓存该图片到内存。
如果使用频率较低的图片,或者想要保证图片不会增加内存占用,可以改用imageWithContentsOfFile:。该函数系统不会自动缓存。
举个例子界面A有5张图片,界面B有5张图片,用户从A到B再回到A之后,imageNamed:加载方式会产生10张图的缓存,但是imageWithContentsOfFile:在退出B时清理掉B的图片缓存,回到A时只有5张图片的缓存。
imageNamed
优点:
1. 系统自带缓存机制
2. 频繁使用加载速度快
缺点:
1. 内存占用增加
2. 缓存由系统控制,不可控
imageWithContentsOfFIle
优点:
1. 内存释放时机可控
2. 内存占用少
缺点:
1. 加载速度稍慢
2. 没有缓存机制,需要自己实现
综上所述,如果加载较大图片,或者不常用页面的图片时,可以使用imageWithContentsOfFile:,这样可以避免由于图片缓存导致APP内存占用过大;在一些常用页面的一些常用图片,为了提高加载速度,可以考虑使用imageNamed:,但是用imageNamed:加载图片会导致内存占用的不可控制,系统自己的缓存不能用代码控制去清理。因此还是建议主要使用imageWithContentsOfFIle:的方式加载图片,特别是一些较大的图。
二、非缓存的加载方式
+(UIImage *)imageWithContentsOfFile:(NSString *)path
+(UIImage *)imageWithData:(NSData *)data
三、何时使用imageNamed方法
1、采用imageNamed方法的图片加载情况
图片资源反复使用到,如按钮背景图片的蓝色背景,这些图片要经常用到,而且占用内存少
2、不应该采用的情况:
(1)图片一般只使用一次,如一些用户的照片资源
(2)图片资源较大,加载到内存后,比较耗费内存资源