UIImage imageWithContentsOfFile

2021-08-11  本文已影响0人  KB_MORE

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 占用内存将会更大.

上一篇下一篇

猜你喜欢

热点阅读