Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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 进入后台时释放内存_Ios_Swift - Fatal编程技术网

Ios 进入后台时释放内存

Ios 进入后台时释放内存,ios,swift,Ios,Swift,我有一个SKTextures字典,可以缓存最近加载的纹理(70左右)。当收到内存警告时,我会释放它们,如下所示: let keys = textures.keys.array for key in keys { textures[key] = nil } 这非常有效,我可以在Xcode调试器中看到内存实际上被释放了 然而,当我尝试在ApplicationIdentinterBackground()上释放它们时,它看起来并没有完全起作用。内存使用量下降了一小部分(5-20MB),但在应用

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

let keys = textures.keys.array
for key in keys {
    textures[key] = nil
}
这非常有效,我可以在Xcode调试器中看到内存实际上被释放了

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

这是调试器的一个怪癖,内存被释放了吗?还是垃圾收集器在应用程序挂起之前没有足够的时间清理?还是我做错了

更新:我很确定这与SpriteKit在进入背景时自动暂停SKView有关。通过在释放纹理之前手动暂停视图,可以很容易地再现该纹理。这样,即使收到内存警告,内存也不会被释放

这是调试器的一个怪癖,内存被释放了吗

我会把它描述为内存管理工作的一个怪癖。有一个虚拟内存管理系统。内存正在被释放,但这并不意味着它被清空/回收,如果你明白我的意思的话。你所做的就是说这个内存是空闲的,但是除非它需要,否则系统不会占用它


测试的方法是编写另一个故意占用内存的应用程序,并在应用程序处于后台时运行它。即使在你被暂停的时候,仪器也会工作,事实上你的内存使用量会下降。

旁注:你应该考虑使用<代码> nSCACHE/CONT>。IOS没有垃圾收集器;内存管理在编译时完成。有关更多信息,请参阅我将其从Dictionary更改为NSCache,以了解它是否有所不同。它工作得很好,但在进入后台时仍然有相同的行为。我可以看到这种情况,但为什么在不进入后台的情况下释放内存时不会发生相同的情况呢?不管怎样,我编写了另一个应用程序,可以连续加载图像(我让它运行,直到内存中有大约2GB),但是第一个应用的使用率没有下降。在我看到更改之前,第二个应用程序需要分配多少内存?