我们的应用程序(iOS 9.1、Xcode 7.1)使用 SpriteKit 并因“因内存问题而终止”而崩溃。我开始删除越来越多的代码,最后发现创建和丢弃普通 SKScene 实例的简单操作会耗尽内存。事实上,就像这样简单:
while true {
_ = SKScene(size: CGSize(width: 100.0, height: 100.0))
}
最终会导致应用程序因同样的内存问题而崩溃。我在调试导航器中观察它,“内存”值 swift 上升,然后应用程序崩溃。使用不同的类,例如:
while true {
_ = [Int](count:1000, repeatedValue:0)
}
会占用大量 CPU,但实例会被干净地释放并且内存永远不会耗尽。
我尝试子类化 SKScene 并添加一个 deinit 来打印一条消息。正如我所预料的那样打印了消息,但内存还是用完了。
我们的问题:我们用很多额外的东西对 SKScene 进行子类化,如果我们在应用程序的执行生命周期中创建和丢弃更多的 10 或 12 个实例(顺序),应用程序就会耗尽内存。永远不会有两个以上的实例处于事件状态。我们审查了代码,没有强大的引用循环。
SKScene 是否需要我们做一些特殊的事情来避免此类内存问题?
最佳答案
你是对的,使用这段代码使用的内存确实增加了。
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 迭代结束时等待一秒钟确实可以解决问题。
while true {
_ = UIButton(type: .DetailDisclosure)
sleep(1)
}
结论
我的想法是,使用的内存确实会增长,这仅仅是因为系统没有足够的时间为旧对象/值释放内存。
关于ios - SKScene 和内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33578149/