ios - SKScene 和内存问题

标签 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))
}

最终会导致应用程序因同样的内存问题而崩溃。我在调试导航器中观察它,“内存”值 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/

相关文章:

swift - SpriteKit : center SKNode in scene

ios - 通过代码从一个 ViewController 切换到另一个

c - 重定向 C 内存泄漏中的指针

java - 匿名 Handler 或 Runnable 会造成内存泄漏吗?

ios - IQKeyboardManagerSwift 工具栏未在 WebView 中禁用

ios - 自界混淆

ios - WKWebview 允许LinkPreview 错误地中断文本选择

iphone - 删除注释时 MKMapView 泄漏还是只有我泄漏?

ios - 如何以不同的尺寸显示 2 个不同的原型(prototype)单元

ios - 如何选择性地将值传递给 Swift 中的闭包?