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
}
}