我有一个大小为200KB的图像的UIImage实例,然后我创建了UIImageView的5个实例引用相同的这个UIImage。多次显示相同图像时如何优化内存?
我想知道在这种情况下分配了多少内存 - 只有200KB(一个UIImage实例)或1MB(对于5个克隆的UIImage实例)?在浪费内存的情况下,是否有有效的解决方法?
我有一个大小为200KB的图像的UIImage实例,然后我创建了UIImageView的5个实例引用相同的这个UIImage。多次显示相同图像时如何优化内存?
我想知道在这种情况下分配了多少内存 - 只有200KB(一个UIImage实例)或1MB(对于5个克隆的UIImage实例)?在浪费内存的情况下,是否有有效的解决方法?
一对夫妇的想法:
UIImage
是引用类型,所以当你引用同一个图像五次,你一般会在内存中有一个图像对象。这取决于你如何做到这一点。例如,如果每次使用UIImage(data:)
或类似的东西,每次都可以实例化一个新对象,但是如果仅实例化一个UIImage
,然后在五次后继续使用,则不会看到重复的内存消耗发生。作为题外话:
你说图像具有尺寸200KB的。这是原始资产的规模,还是你知道这是运行时需要多少内存?
我问的原因是JPG和PNG文件通常是压缩的,但是当您在图像视图中使用它时,它将被解压缩。图像占用的内存量与原始资源的文件大小无关,而与图像的尺寸(以像素为单位)相对应。因此,676 kb的2560 x 1440像素随机PNG实际上可能需要14mb的内存(每个像素4个字节)。
请注意,此内存消耗对应于所讨论图像的维度,而不是您添加它的图像视图的维度。如果您担心内存使用情况,并且图像尺寸超过图像视图的大小(乘以设备比例),则可能需要考虑调整图像大小。
未来,您可以使用仪器凭经验回答这些问题。例如,在下面的时间线中,在绿色路标处,我加载了一个UIImage
,其中676kb资源的影响程度适中,我将图像视图image
设置为在紫色路标处使用此资产,因为它未压缩此2560 x 1440 px图像,并且我在橙色路标上加载了五个图像视图,并且可以忽略更多的内存影响。