iOS是否默认在内存中缓存图像? (RAM)

时间:2016-01-31 17:15:24

标签: ios memory-management

当我在整个应用程序中移动时,我一直在努力找出为什么我的应用程序继续增加内存。

当离开视图时,我确保检查控制器是否已取消初始化,但是在视图中添加的内存保留。我使用了仪器工具,但没有检测到任何泄漏,重复离开/重新进入视图对使用的内存没有任何影响。

这让我相信iOS默认会将UIImage缓存到内存中,并且只有在设备需要时才会释放内存。

我正在使用的视图是UICollectionView,它向用户显示已上传到我的服务器的图片库。目前我每个用户只有10个图像,但你可以想象是否有相当多的图像,并且可以相当快地增加内存。

我需要担心这段记忆吗?在设备需要释放一些空间之前,图像是否保留在内存中的默认行为?我不想提交到应用程序商店,因内存管理不善而被拒绝。

编辑:我还要注意使用UIImage(data: NSData)构造函数构建图像。

1 个答案:

答案 0 :(得分:2)

iOS本身可以缓存大量内存。对它的底层支持是在UUCit内部使用的libcache中,以一种你无法访问的方式。

在“记忆压力”期间,即当RAM低时,向所有听众广播事件(技术上,结节)。您的应用正在侦听,因为框架会自动打开一个kevent文件描述符,并使用众所周知的didReceiveLowMemoryWarning对其做出反应。 请记住,iOS中没有交换(为此答案的范围折扣压缩RAM),所以这种情况经常发生。

即使在将didReceiveLowMemoryWarning传递给您之前,libcache也使用了“区域压力释放”的malloc功能,您可以在自己看到:

...
   /* Empty out caches in the face of memory pressure. The callback may be NULL. Present in version >=
 8. */
    size_t      (*pressure_relief)(struct _malloc_zone_t *zone, size_t goal);
} malloc_zone_t;

因此,图像(记忆的主要消费者)将在必要时被清除,因此您应该非常关注。也就是说,如果你知道你不再需要给定的UI对象,你当然可以明确地处理它。当然,如果您有任何其他资源无法以这种方式自动清除,您应该在委托中处理它们。因为如果你不这样做,Jetsam会抛弃你的应用程序(即用一个无法解决的-9来杀死你),并且可能在你的优先级乐队中杀死一些无辜的人。

相关问题