问题 何时缓存UIImage资源是否值得?


我一直在使用图像文件进行大量的iPhone UI工作,这些图像文件在单个视图中的多个位置或整个应用程序的多个视图中使用。在某些情况下,我正在绘制新的图标,通常是通过合成2个小图像(每个小于4 KB)。

我已经考虑过优化图像的加载,但我不确定最佳实践是什么。我猜想保存使用CG函数创建或更改的任何图像是值得的。对于未更改的图像,从捆绑中加载图像的开销是多少?

UIImage* image = [UIImage imageNamed:@"myImage.png"]

考虑到移动设备的内存限制,在考虑缓存图像时哪些因素最重要?我想到了图像的大小,可以缓存的图像总数以及加载单个图像的次数。


9749
2017-07-15 20:35


起源

UIImage imageNamed: 实际上已经缓存了图像。 - Till
完全正确,@ Till。我不知道我在文档中是如何错过的。看起来我的代码库中已经存在一种不好的做法。 - goldierox


答案:


在WWDC(2011)的最新性能会议中,Apple建议不要在大多数情况下缓存图像。他们建议您只有在知道事实后才能缓存图像,在性能分析之后,您需要提前缓存图像,因为您无法花时间从磁盘加载它们并对其进行解码。在大多数情况下,你可能负担得起。

他们特别注意到,就像@Till那样 +[UIImage imageNamed:] 缓存进程生命周期中的图像,因此他们建议使用非缓存加载方法,例如 +[UIImage imageWithContentsOfFile:]

原因是内存是iOS设备上受限制的资源,因此如果您缓存图像,则可能会对系统造成内存压力,并且应用程序会受到jetsammed的攻击。而且,由于iOS 5首先使用更多内存,因此如果您正在缓存一堆UIImages,那么您的应用程序将更有可能获得jetsammed。


16
2017-07-15 22:33



谢谢你非常彻底的答复。鉴于我们的大多数图像是多么小以及它们被重复使用的频率,我认为我们可以放弃使用 +[UIImage imageNamed:] 在大多数地方。 - goldierox
这个答案很棒,令人惊讶。只是那种你不希望得到任何赞成的东西:)。无论如何,我已经从这里链接到了它 stackoverflow.com/a/14032531/8047 (只是一些类别 - 喜欢非缓存选项)。 - Dan Rosenstark
等等,这只是一个时间/性能问题?我想如果我有一个 UIImage 缓存我通过不在内存中保存资源X次...不? - Dan Rosenstark
但是如果iOS需要内存,它会转储缓存,对吧? - Victor Engel
@VictorEngel很高兴知道...有没有人测试过这个? - max.mustermann