gpt4 book ai didi

ios - SKScene 和内存问题

转载 作者:可可西里 更新时间:2023-11-01 02:18:41 26 4
gpt4 key购买 nike

我们的应用程序(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com