1.图片加载
1.1 imageNamed
把image
缓存
到内存
里面,此方法在系统缓存中查找具有指定名称的图像对象,并返回最适合主屏幕的图像变体。如果匹配的图像对象尚未在缓存中,此方法将定位并从磁盘或可用资产目录加载图像数据,然后返回结果对象。系统可以在
任何时候
清除缓存的图像数据以释放内存。仅对缓存中但当前未使用
的图像进行清除
1.2. imageWithContentsOfFile
imageWithContentsOfFile:
或initWithContentsOfFile:
方法创建一个图像对象,其中初始数据不在包中。这些方法每次从磁盘加载图像数据,因此不应该使用它们重复加载相同的图像。
2缓存
2.1. 缓存加载方式(imageNamed) :
使用imageNamed
这个方法生成的UIImage
对象,会在应用的bundle中寻找图片,如果找到则Cache
到系统缓存
中,作为内存的cache
,而程序员是无法操作cache
的,只能由系统自动处理
,如果我们需要重复
加载一张图片,那这无疑是一种很好的方式,因为系统能很快的从内存的cache找到这张图片,但是试想,如果加载很多很大的图片的时候,内存消耗过大的时候,就会会强制释放内存,即会遇到内存警告(memory warnings).由于在iOS系统中释放图片的内存比较麻烦,所以容易产生内存泄露。
总结下:
使用imageNamed:
图片资源反复使用
到,如按钮背景图片的蓝色背景,这些图片要经常用到,而且占用内存少 button背景图片的蓝色背景。这些图片要常常常使用到,并且占用内存少
不使用 imageNamed : 图片资源
较大
,加载到内存后,比较耗费
内存资源 ,图片一般只使用一次
。
(1)图片一般仅仅使用一次。如一些用户的照片资源,开屏
(2)图片资源较大,载入到内存后,比较耗费内存资源
2.2.非缓存加载方式 (imageWithContentsOfFile) :
相比上面的imageNamed
这个方法要写的代码多了几行,使用imageWithContentsOfFile
的方式加载的图片,图片会被系统以数据
的方式进行加载.返回的对象不会保存在缓存
中,一旦对象销毁就会释放内存
,所以一般不会因为加载图片的方法遇到内存问题.
3.优缺点
3.1 imageNamed 的缺点
第一次读取的图片保存到缓冲区
, 然后永不销毁. 如果这个图片过大, 占用几百 kb, 这一块的内存将不会释放, 必然导致内存的浪费, 而且这个浪费的周期与APP的生命周期同步
.
3.2 imageWithContentsOfFile 的缺点
当我们需要图片的时候就会去沙盒
中读取这个图片文件, 转换成UIImage对象
来使用. 现在假设一种场景:
image@2x.png 图片占用 5kb 的内存
image@2x.png 在多个界面都用到, 且有7处会同时显示这个图片
通过代码分析就可以知道 Resource
这个方式在这个情景下会占用 5kb/个 X 7个 = 35kb 内存. 然而, 在 ImageAssets
方式下, 全部取自字典缓存
中的UIImage, 无论有几处显示图片, 都只会占用 5kb/个 X 1个 = 5kb 内存. 此时 Resource
占用内存将会更大.
网友评论