在任何给定时刻运行分配工具时,我的iPad应用程序分配的内存少于5MB。我已经非常彻底,并确保一切正确发布。我的应用程序是一个标签栏应用程序,它可以加载大量图像,视频和PDF。我已经确保处理这个适当的空缓存等,以释放内存。
然而,当我运行Activity Monitor Instrument时,我的应用程序在我的iPad上运行,我的应用程序的内存使用量逐渐增加,最终达到100MB以上并崩溃。
我不确定该怎么做,并且没有特定的代码块导致问题。整个应用程序是一个记忆猪,我以前从来没有遇到过这个问题。
除了分配,我的应用程序消耗这么多内存的原因是什么?是否有其他工具可用于跟踪哪些进程耗尽内存?
编辑:正如有人提到的,我使用了Build and Analyze来确保所有问题都得到了清理。
答案 0 :(得分:2)
很多时候CGImages和其他大型媒体blob没有出现在Allocations上 - 它们可能会显示为一些看似无害的小对象,但它们指向一些大型对象,就像使用“怪异”技术分配的图像(如内存映射文件,显卡内存等)。 另一方面,活动监视器工具查看为您的应用程序加载的4k页面使用的内存,因此包括这些媒体blob。
我不知道您的缓存方案是什么。这是一个场景: 您需要加载50个100k jpegs - 用户一次最多只能看到3个jpeg。 50个100k图像是5MB内存。因此,您可以从互联网上加载jpeg的所有数据。如果你然后从这个数据创建50个CGImages,那么每个CGImages将消耗(假设jpegs是每个像素1000x1000 * 4bytes =)4MB的内存。所以这将是200MB将它们全部放在内存中。哪个不行。所以你需要保持100k压缩的nsdata blob,然后只需要在你需要的时候创建1或3个CGimages。它是一种保持平稳和平衡的艺术。
在其他工作中:在分配中 - 查看您一次拥有的CGImageRefs等的数量,并降低 数字。