当我在整个应用程序中移动时,我一直在努力找出为什么我的应用程序继续增加内存。
当离开视图时,我确保检查控制器是否已取消初始化,但是在视图中添加的内存保留。我使用了仪器工具,但没有检测到任何泄漏,重复离开/重新进入视图对使用的内存没有任何影响。
这让我相信iOS默认会将UIImage
缓存到内存中,并且只有在设备需要时才会释放内存。
我正在使用的视图是UICollectionView
,它向用户显示已上传到我的服务器的图片库。目前我每个用户只有10个图像,但你可以想象是否有相当多的图像,并且可以相当快地增加内存。
我需要担心这段记忆吗?在设备需要释放一些空间之前,图像是否保留在内存中的默认行为?我不想提交到应用程序商店,因内存管理不善而被拒绝。
编辑:我还要注意使用UIImage(data: NSData)
构造函数构建图像。
答案 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来杀死你),并且可能在你的优先级乐队中杀死一些无辜的人。