ios开发的内存管理中的奇怪之处

时间:2012-04-13 10:50:13

标签: objective-c ios cocoa

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

1.打开应用程序,查看内存仪器(活动监视器),它是8.95M

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

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

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

1 个答案:

答案 0 :(得分:3)

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

“懒惰增长,懒惰缩小”算法试图通过仅增加索引来避免调整结构索引大小的成本,如果它太小而且仅在它太大时缩小它。例如,典型的算法可能只有在理想大小至少比它大三倍时才会增大索引,并且只有当它超过理想大小的三倍时才缩小它。如果应用程序快速分配并释放资源集合,则还需要这样做以防止大量调整大小操作 - 您希望索引大小有点'粘滞'。

当您打开大对象并使用GUI对象时,会使索引太小而且会增长。但是当你关闭大对象时,你的索引只会有点太大,所以它不会缩小。

如果设备受到内存压力,索引将缩小。如果应用程序继续减少其对UI资源的使用,则索引将缩小。如果应用程序使用更多UI资源,则索引不需要再次增长。

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

当您完成处理所有这些文件后,您的桌面会有一些额外的堆叠。这样可以避免下次需要处理大量文件时重新编制索引。