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

标签 ios memory-management

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

离开 View 时,我确保检查 Controller 是否已取消初始化并且确实是,但在 View 中添加的内存会保留。我使用了 instruments 工具,它没有检测到任何泄漏,反复离开/重新进入 View 对使用的内存没有任何影响。

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

我正在使用的 View 是一个 UICollectionView,它向用户显示已上传到我的服务器的图片库。目前,我将每个用户限制为 10 张图像,但正如您可以想象的那样,如果有相当多的图像并且可以相当快地增加内存。

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

编辑: 值得注意的是,我正在使用 UIImage(data: NSData) 构造函数构建图像。

最佳答案

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

在“内存压力”期间,即当 RAM 不足时,向所有听众广播一个事件(从技术上讲,一个 knote)。您的应用程序正在监听,因为框架会自动打开一个 kevent 文件描述符,并使用众所周知的 didReceiveLowMemoryWarning 对其作出 react 。 请记住,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 对象,您当然可以显式处理它。当然,如果你有任何额外的资源不能用这种方式自动清除,你应该在委托(delegate)中处理它们。因为如果你不这样做,Jetsam 将抛弃你的应用程序(即用无法捕获的 -9 杀死你),并且可能还会杀死你优先级范围内的一些无辜者。

关于ios - iOS 是否默认在内存中缓存图像? (内存),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35116742/

相关文章:

ios - 无法在 iOS 设备上运行单元测试

ios - 在 iOS6 上断开 Facebook 与应用程序的连接?

ios - xcode 核心数据类中的数据类型不匹配

Java线程栈内存分配与管理

c - 动态分配的结构数组传递给函数并通过索引访问

objective-c - AVAssetReader 采样率

ios - 如何集成雷达叠加显示天气?

c - 显示静态和动态分配之间差异的 C 代码

linux - 什么是linux中的内存回收

c++ - C++ 中的非连续数组指针