【发布时间】:2018-05-19 17:26:38
【问题描述】:
经过几天和几天的研究和尽力,我还没有找到解决内存泄漏问题的方法。我已经尝试了很多我在这个论坛中找到的想法,但似乎没有任何帮助。
我像其他人一样用这段代码加载我的 GameScene.sks:
extension SKNode {
class func unarchiveFromFile(file:String) -> SKNode? {
if let path = Bundle.main.path(forResource: file, ofType: "sks") {
let url = URL(fileURLWithPath: path)
do {
let sceneData = try Data(contentsOf: url, options: .mappedIfSafe)
let archiver = NSKeyedUnarchiver(forReadingWith: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode
archiver.finishDecoding()
return scene
} catch {
print(error.localizedDescription)
return nil
}
} else {
return nil
}
}
我在这里的代码中使用它:
func load(level: String) {
if let levelNode = SKNode.unarchiveFromFile(file: level) {
mapNode = levelNode
mapNode.name = "MapNode"
self.worldLayer.addChild(mapNode)
loadTileMap()
}
}
如果我省略 self.worldLayer.addChild(mapNode) 行,一切都会完美运行,内存使用量将永远不会增加。但如果我使用它(我需要它!),记忆就会不断攀升。
使用 Instruments 表示带有 let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode 的行会导致所有内存泄漏。
很遗憾,我没有得到它,也没有设法消除我的泄漏。
感谢所有帮助。提前致谢。
【问题讨论】:
-
你的代码太旧了,你不需要那个扩展了,用
SKNode(fileNamed:level) -
感谢您的提示。我试过了,至少我现在知道扩展不会导致泄漏,因为只需添加 SKNode(fileNamed: level) 内存泄漏与以前完全相同。在进入新场景之前将其移除并没有帮助。在我的场景和 mapNode 之间一定有一个 steong 引用。有什么想法可以解决这个问题吗?
-
你有 gameScene.swift 文件吗?不要在 inits 中做任何事情,因为那是错误的
-
当然是的。什么是错误?我用大小初始化它。而是使用可选项并在代码中初始化它们?
-
我的意思是你是否覆盖了 inits.它创建了两次 GameScene,如果你在 init 中有东西,它就会 deinit。我的猜测是 2 个场景相互保留
标签: ios xcode memory-leaks sprite-kit nskeyedunarchiver