Xcode NSKeyedUnarchiver内存泄漏SKNode扩展

时间:2017-12-05 22:52:25

标签: ios xcode memory-leaks sprite-kit nskeyedunarchiver

经过数天和数天的研究并尽我所能,我还没有找到解决内存泄漏问题的方法。我已经尝试了很多我在这个论坛中发现的想法,但似乎没有什么可以帮助我。

我像其他人一样使用此代码加载我的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行导致所有内存泄漏。

不幸的是我没有得到它并且没有设法消除我的泄漏。

我感谢所有人的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,我仍然无法解决问题,但我发现了一些事情。我可以把我想要的东西放在场景编辑器(.sks)文件中,我不会得到任何内存泄漏。甚至是瓷砖地图。但是,只要我在一些tilemap内存中只放置一个tile,内存泄漏就会再次上升。一块瓷砖如何导致所有这些问题?