Ios 进入后台时释放内存
我有一个SKTextures字典,可以缓存最近加载的纹理(70左右)。当收到内存警告时,我会释放它们,如下所示:Ios 进入后台时释放内存,ios,swift,Ios,Swift,我有一个SKTextures字典,可以缓存最近加载的纹理(70左右)。当收到内存警告时,我会释放它们,如下所示: let keys = textures.keys.array for key in keys { textures[key] = nil } 这非常有效,我可以在Xcode调试器中看到内存实际上被释放了 然而,当我尝试在ApplicationIdentinterBackground()上释放它们时,它看起来并没有完全起作用。内存使用量下降了一小部分(5-20MB),但在应用
let keys = textures.keys.array
for key in keys {
textures[key] = nil
}
这非常有效,我可以在Xcode调试器中看到内存实际上被释放了
然而,当我尝试在ApplicationIdentinterBackground()上释放它们时,它看起来并没有完全起作用。内存使用量下降了一小部分(5-20MB),但在应用程序恢复之前,其余部分不会被释放
这是调试器的一个怪癖,内存被释放了吗?还是垃圾收集器在应用程序挂起之前没有足够的时间清理?还是我做错了
更新:我很确定这与SpriteKit在进入背景时自动暂停SKView有关。通过在释放纹理之前手动暂停视图,可以很容易地再现该纹理。这样,即使收到内存警告,内存也不会被释放
这是调试器的一个怪癖,内存被释放了吗
我会把它描述为内存管理工作的一个怪癖。有一个虚拟内存管理系统。内存正在被释放,但这并不意味着它被清空/回收,如果你明白我的意思的话。你所做的就是说这个内存是空闲的,但是除非它需要,否则系统不会占用它
测试的方法是编写另一个故意占用内存的应用程序,并在应用程序处于后台时运行它。即使在你被暂停的时候,仪器也会工作,事实上你的内存使用量会下降。旁注:你应该考虑使用<代码> nSCACHE/CONT>。IOS没有垃圾收集器;内存管理在编译时完成。有关更多信息,请参阅我将其从Dictionary更改为NSCache,以了解它是否有所不同。它工作得很好,但在进入后台时仍然有相同的行为。我可以看到这种情况,但为什么在不进入后台的情况下释放内存时不会发生相同的情况呢?不管怎样,我编写了另一个应用程序,可以连续加载图像(我让它运行,直到内存中有大约2GB),但是第一个应用的使用率没有下降。在我看到更改之前,第二个应用程序需要分配多少内存?