我们的应用程序(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是否做了任何需要我们做一些特殊事情以避免此类内存问题的事情?
答案 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)
}
我的想法是,使用过的内存确实在增长,因为系统没有足够的时间来释放旧对象/值的内存。