Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS是否默认在内存中缓存图像?(RAM)_Ios_Memory Management - Fatal编程技术网

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

iOS是否默认在内存中缓存图像?(RAM),ios,memory-management,Ios,Memory Management,我一直在努力找出为什么我的应用程序在整个应用程序中移动时内存不断增加 在离开视图时,我确保检查控制器是否已取消初始化,是否已取消初始化,但在视图中添加的内存仍保留。我使用了instruments工具,但它没有检测到任何泄漏,重复离开/重新进入视图对已用内存没有任何影响 这让我相信iOS默认情况下会将UIImage缓存到内存中,并且只有在设备需要时才会释放内存 我正在使用的视图是一个UICollectionView,它向用户显示已上载到我的服务器的图片库。目前,我将此限制为每个用户10张图像,但正

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

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

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

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

我需要担心这个记忆吗?在设备需要释放一些空间之前,图像是否会保留在内存中?我不想提交到应用程序存储并因内存管理不善而被拒绝


EDIT:还需要注意的是,我正在使用
UIImage(数据:NSData)
构造函数构建图像

iOS本身会缓存大量内存。这方面的底层支持在libcache中,UIKit以您无法访问的方式在内部使用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杀死你),并可能在你的优先级范围内杀死一些无辜者。

iOS本身会缓存大量内存。这方面的底层支持在libcache中,UIKit以您无法访问的方式在内部使用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杀死你),并可能在你的优先级范围内杀死一些无辜的人。

当你说“离开视图”时,你如何确保该控制器已取消初始化?离开此视图时,请确保释放所有数组和强属性。iOS通过UIKit处理UI,最可见的组件保存在内存中。UIKit的机制支持自动释放不可见的组件,并将其从内存中释放出来,并为其他组件做好准备。当您说“离开视图”时,您如何确保此控制器已取消初始化?离开此视图时,请确保释放所有数组和强属性。iOS通过UIKit处理UI,最可见的组件保存在内存中。UIKit的机制支持自动释放不可见的组件,并将其从内存中释放出来,为其他组件做好准备。