Ios SceneKit内存泄漏

Ios SceneKit内存泄漏,ios,swift,memory,scenekit,scnscene,Ios,Swift,Memory,Scenekit,Scnscene,使用scnView切换到VC后,应用程序的内存增加。我使用了deinit并将geometry设置为nil,但没有任何帮助。我在stack上看到了一些关于使用deinit来解决这个问题的技巧,但它对我不起作用。每次我使用scnScene 有几个问题:1。您是否确定正在调用您的deinit(即,您没有一个强引用循环阻止场景被释放)?2.你说“我在stack上看到了一些关于…”的提示。。。如果可能,请包括这些参考资料。3.什么是泄漏,我们谈论的是怎样的内存?“调试内存图”告诉您什么?工具的分配工具告诉

使用
scnView
切换到
VC
后,应用程序的内存增加。我使用了
deinit
并将
geometry
设置为
nil
,但没有任何帮助。我在stack上看到了一些关于使用
deinit
来解决这个问题的技巧,但它对我不起作用。每次我使用
scnScene


有几个问题:1。您是否确定正在调用您的
deinit
(即,您没有一个强引用循环阻止场景被释放)?2.你说“我在stack上看到了一些关于…”的提示。。。如果可能,请包括这些参考资料。3.什么是泄漏,我们谈论的是怎样的内存?“调试内存图”告诉您什么?工具的分配工具告诉你什么?我们需要一些关于泄漏类型和大小的细节。这是非常不清楚的。不相关,但在
视图中将消失
,记得调用
超级
格式副本。每次我用
SCNView
返回
VC
,内存增加,在仪器分配上显示
CG光栅数据
~18mb-20MB
上增加,每个
CoreGraphics CGDataProviderCreateWithCopyOfData
都是
6,94 mib
。我加了super,jus忘了复制到post,对不起,首先,仪器中的“持续”数字在上升,对吧,不是“总数”,例如?第二,正在解除分配的视图控制器是否被调用?(即,您是否看到Denit被调用和/或您没有看到应在“调试内存图”中释放的对象)?第三,您能否共享您引用的链接?就“总计”v“持久性”而言,仪器中的“总计”并不重要(因为这包括已释放的内存)。唯一重要的是“Persistent”列。第一次上升多少并不重要,而是以后每次继续上升多少。分配图的快照(就像我在回购协议中做的那样)会很有用。在
deinit
中,添加一个断点和/或日志语句,并确认已到达该断点和/或日志语句。如果没有,你是在浪费时间进一步寻找。这总是第一件要确认的事情。有几个问题:1。您是否确定正在调用您的
deinit
(即,您没有一个强引用循环阻止场景被释放)?2.你说“我在stack上看到了一些关于…”的提示。。。如果可能,请包括这些参考资料。3.什么是泄漏,我们谈论的是怎样的内存?“调试内存图”告诉您什么?工具的分配工具告诉你什么?我们需要一些关于泄漏类型和大小的细节。这是非常不清楚的。不相关,但在
视图中将消失
,记得调用
超级
格式副本。每次我用
SCNView
返回
VC
,内存增加,在仪器分配上显示
CG光栅数据
~18mb-20MB
上增加,每个
CoreGraphics CGDataProviderCreateWithCopyOfData
都是
6,94 mib
。我加了super,jus忘了复制到post,对不起,首先,仪器中的“持续”数字在上升,对吧,不是“总数”,例如?第二,正在解除分配的视图控制器是否被调用?(即,您是否看到Denit被调用和/或您没有看到应在“调试内存图”中释放的对象)?第三,您能否共享您引用的链接?就“总计”v“持久性”而言,仪器中的“总计”并不重要(因为这包括已释放的内存)。唯一重要的是“Persistent”列。第一次上升多少并不重要,而是以后每次继续上升多少。分配图的快照(就像我在回购协议中做的那样)会很有用。在
deinit
中,添加一个断点和/或日志语句,并确认已到达该断点和/或日志语句。如果没有,你是在浪费时间进一步寻找。这总是第一件要确认的事情。
var ship1: SCNNode!
    var ship2: SCNNode!
    var ship3: SCNNode!
    var ship4: SCNNode!
    let cameraNode = SCNNode()
    let lightNode = SCNNode()
    let ambientLightNode = SCNNode()

 class RecordVideoViewControllerWS: UIViewController {


    @IBOutlet weak var scnView: SCNView!

     override func viewDidLoad() {
            super.viewDidLoad()
          cameraNode.camera = SCNCamera()
                scnScene.rootNode.addChildNode(cameraNode)
                cameraNode.position = SCNVector3(x: 0, y: 0, z: 15)
                scnView.scene = scnScene

                lightNode.light = SCNLight()
                lightNode.light!.type = .omni
                lightNode.position = SCNVector3(x: 0, y: 10, z: 10)
                scnScene.rootNode.addChildNode(lightNode)

                // create and add an ambient light to the scene
                ambientLightNode.light = SCNLight()
                ambientLightNode.light!.type = .ambient
                ambientLightNode.light!.color = UIColor.darkGray
                scnScene.rootNode.addChildNode(ambientLightNode)
                 ship1 = nodeFromResource(assetName: "shipFolder/test0", extensionName: "scn")
                ship2 = nodeFromResource(assetName: "shipFolder/test1", extensionName: "scn")
                ship3 = nodeFromResource(assetName: "shipFolder/test2", extensionName: "scn")
                ship4 = nodeFromResource(assetName: "shipFolder/test3", extensionName: "scn")


                scnScene.rootNode.addChildNode(ship1)
                scnScene.rootNode.addChildNode(ship2)
                scnScene.rootNode.addChildNode(ship3)
                scnScene.rootNode.addChildNode(ship4)
    }



    override func viewWillDisappear(_ animated: Bool) {

                ship1.removeFromParentNode()
                ship1.geometry = nil

                ship2.removeFromParentNode()

                ship2.geometry = nil

                ship3.removeFromParentNode()

                ship3.geometry = nil

                ship4.removeFromParentNode()

                ship4.geometry = nil

                cameraNode.removeFromParentNode()
                cameraNode.geometry = nil
                lightNode.removeFromParentNode()
                lightNode.geometry = nil

                ambientLightNode.removeFromParentNode()
                ambientLightNode.geometry = nil



                }
 deinit {
        scnScene.rootNode.cleanup()
    }


}

    extension SCNNode {
        func cleanup() {
            for child in childNodes {
                child.cleanup()
            }
            geometry = nil
        }
    }