如何从场景中删除SCNNode并释放Xamarin iOS中的内存

时间:2019-01-23 14:43:50

标签: c# xamarin memory-management scenekit arkit

RemoveFromParentNode()仅从父节点/场景中删除该节点,但不会从内存中删除它,因为在执行该行之后您仍然可以引用该节点。

我想知道如何从内存中完全删除该节点,将节点设置为null对变量没有影响,如下面的代码所示。

我见过的大多数解决方案都很快,但是在Xamarin.iOS C#中找不到解决方案

var myNode = new SCNNode
{
    Name = "My Node"
};

SView.Scene.RootNode.Add(myNode);

SView.Scene.RootNode.EnumerateChildNodes((SCNNode node, out bool stop) =>
{
    node.RemoveFromParentNode();
    node = null; // Does nothing 

    stop = false;
});

try
{
    Debug.WriteLine(myNode.Name);
}
catch (NullReferenceException ex)
{
    Debug.WriteLine("We already deleted myNode" + ex.Message);
}

预期可以解决:“我们已经删除了myNode”。

实际输出:“我的节点”

1 个答案:

答案 0 :(得分:1)

SCNode是一个本地ObjC对象,顶部带有.Net包装器。分配null时,这仅是参考计数的Xamarin.iOS / Mono端。您需要对其调用Dispose才能释放这些本机引用。

node.Dispose();