【问题标题】:Xcode NSKeyedUnarchiver Memory Leak SKNode ExtensionXcode NSKeyedUnarchiver 内存泄漏 SKNode 扩展
【发布时间】: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


【解决方案1】:

好吧,我仍然无法解决问题,但我发现了一些事情。我可以将我想要的所有内容放入场景编辑器 (.sks) 文件中,并且不会出现任何内存泄漏。甚至瓷砖地图。但是只要我在一些瓷砖地图中只放一个瓷砖,内存泄漏就会再次上升。一个瓷砖怎么会导致所有这些问题?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 2010-09-15
    • 2018-05-30
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    相关资源
    最近更新 更多