输入背景时释放内存

时间:2014-11-20 23:10:25

标签: ios swift

我有一个SKTextures词典,可以缓存最近加载的纹理(70左右)。当收到内存警告时,我正在释放它们,如下所示:

let keys = textures.keys.array
for key in keys {
    textures[key] = nil
}

这很好用,我可以在Xcode调试器中看到内存实际被释放。

但是,当我尝试在applicationDidEnterBackground()上释放它们时,它看起来并不完全有效。内存使用量下降了一个小的不一致量(5-20​​ MB),但其余部分在应用程序恢复之前不会被释放。

这是一个调试器的怪癖,内存被释放?或者,在应用程序暂停之前,垃圾收集器是否没有足够的时间进行清理?或者我这样做是错的吗?

更新:我很确定这与SpriteKit在进入后台时自动暂停SKView有关。通过在释放纹理之前手动暂停视图,可以轻松地重现这一点。然后,即使收到内存警告,也不会释放内存。

1 个答案:

答案 0 :(得分:2)

  

这是调试器的怪癖,内存正在被释放

我会形容内存管理如何运作的怪癖。这是一个虚拟内存管理系统。记忆正在被释放,但这并不意味着它被清空/回收,如果你明白我的意思。你所做的是这个内存 是免费的,但系统不会 它除非它< em>需要它。

测试的方法是编写另一个故意吞噬内存的应用程序,并在应用程序处于后台运行时运行它。即使您被暂停,仪器也会工作,并且会显示您的内存使用量实际上已经下降。