SKScene和内存问题

时间:2015-11-07 01:32:48

标签: ios swift memory-leaks sprite-kit skscene

我们的应用程序(iOS 9.1,Xcode 7.1)使用SpriteKit,并因“因内存问题而终止”而崩溃。我开始删除越来越多的代码,最后发现创建和丢弃普通SKScene实例的简单行为将耗尽内存。事实上,简单如下:

while true {
    _ = SKScene(size: CGSize(width: 100.0, height: 100.0))
}

最终会导致应用程序因同一内存问题而崩溃。我在调试导航器中观察它,“Memory”值迅速上升,然后应用程序崩溃。使用不同的类,例如:

while true {
    _ = [Int](count:1000, repeatedValue:0)
}

会咀嚼很多CPU,但实例会被彻底释放,内存永远不会耗尽。

我尝试了对SKScene进行子类化并添加了一个打印消息的deinit。消息是按照我的预期打印出来的,但无论如何内存耗尽了。

我们面临的问题是:我们将SKScene子类化为一些额外的东西,如果我们在应用程序的执行生命周期内创建并丢弃更多10或12个实例(按顺序),则app会耗尽内存。永远不会有两个以上的实例存在。我们已经审核了代码,并且没有强大的参考周期。

SKScene是否做了任何需要我们做一些特殊事情以避免此类内存问题的事情?

1 个答案:

答案 0 :(得分:1)

你是对的,用这段代码,用过的内存确实在增长。

while true {
    _ = SKScene(size: CGSize(width: 100.0, height: 100.0))
}

但我不认为这与SKScene直接相关。

当记忆长大时

事实上,与其他类型(类或结构)(如UIButton或大字符串数组)相同的内存行为确实会发生。

这里使用的内存确实在增长。

while true {
    _ = UIButton(type: .DetailDisclosure)
}

这里使用的内存确实也在增长。

while true { 
    _ = [String](count:100000000000, repeatedValue:"Hello world")
}

当记忆不长大时

我注意到在每次迭代结束时等待一秒确实解决了问题。

while true {
    _ = UIButton(type: .DetailDisclosure)
    sleep(1)
}

结论

我的想法是,使用过的内存确实在增长,因为系统没有足够的时间来释放旧对象/值的内存。