gpt4 book ai didi

objective-c - ios开发内存管理中的奇怪现象

转载 作者:行者123 更新时间:2023-12-03 16:58:38 25 4
gpt4 key购买 nike

我的 iPod 中有一个应用程序。

1.打开应用程序,查看内存Instruments(Activity Monitor),为8.95M

2.点击一个按钮,会在屏幕上添加一个带有大图片的UIImageView,目前内存为17.8M。

3.从屏幕上删除UIImageView,稍等一下,现在内存为9.09M。

我确信 UIImageView 在从屏幕上删除后会被释放。这是非常简单的代码。因此,当它删除时,应用程序的状态应该与添加 UIImageView 添加到屏幕之前相同,对吗?但为什么内存是9.09M而不是8.95M呢?如果向屏幕添加更复杂的View,差异就更明显。

最佳答案

这是正常的。这是由于“惰性增长,惰性收缩”算法。这意味着您拥有一个可以调整大小以容纳少量项目或大量项目的数据结构。少量项目的大小调整使用很少的内存,但在处理大量项目时效率不高。调整大数字的大小对于管理大型事物集合非常有效,但会使用更多内存来索引对象。

“惰性增长,惰性收缩”算法试图避免调整结构索引大小的成本,方法是仅在索引太小时增加索引,而在索引太大时仅缩小索引。例如,典型的算法可能仅当其理想大小至少是实际大小的三倍时才增加索引,并且仅当索引的理想大小大于其理想大小的三倍时才缩小索引。如果应用程序快速分配和释放资源集合,这也是防止大量调整大小操作所必需的——您希望索引大小有点“粘性”。

当您打开大对象并使用 GUI 对象时,索引会变得太小,并且索引会增长。但是当您关闭大对象时,索引只是有点太大,因此它不会缩小。

如果设备面临内存压力,索引将会收缩。如果应用程序继续减少对 UI 资源的使用,索引将会缩小。如果应用程序使用更多 UI 资源,索引将不需要很快再次增长。

一个很好的类比可能是你 table 上的一堆纸。如果您可能需要查找 30 篇论文,您可以将它们分成 4 堆。但如果你有 5,000 篇论文,4 堆会使搜索变得乏味。在这种情况下,您将需要更多堆栈。因此,当纸张数量对于 4 堆来说太大时,您需要重新索引到更多数量的堆栈中。但是,当数字变小时,您就不必费心不断地重新索引,直到堆栈太多,因为搜索仍然相当快。

当您处理完所有这些文件后,您的办公 table 上就会多出几叠文件。这可以避免下次需要处理大量论文时重新建立索引。

关于objective-c - ios开发内存管理中的奇怪现象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10139438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com