父级上的 removeChild() 会移除它的子级吗?

removeChild() on parent will remove its child?

我的构造如下:

parent
   + child
   + child
   + child
   + sub-parent
         + sub-child
         + sub-child

现在,我使用 "removeChild()" 的乘法从场景中一个一个地删除元素。像这样:

removeChild(sub-child);
removeChild(sub-child);
removeChild(sub-parent);
//and so on 

没关系,但我发现如果我删除一个父级,它的所有子级也会从场景中消失。 (现在我不确定...)

如何以正确的方式从场景中删除元素?正如我现在所做的那样(一个接一个),或者我可以只删除一个父级并且我的代码会更短一些。还是一样的东西?

您可以删除 "sub-parent",它的子项也将从场景(舞台)中删除。

从舞台上移除显示对象也会移除该对象的所有子对象。把它想象成一个容器来容纳那些子对象。如果您移除容器,也会移除其中的对象。

但是,如果您仍然有对这些子对象的引用,或者有附加到它们的事件侦听器,它们将不会被垃圾回收(它们会留在内存中执行与它们关联的任何代码)。因此,您仍然需要确保在删除父对象时清理所有内容。

"display list"是一个树形结构,如下所示:

当您将 children 添加到容器 (DisplayObjectContainer) 时,这些 children 将保留为该容器的 children,除非它们被专门从中删除它。

当容器或 DisplayObject 附加到 stage 时,它们将呈现。如果 object 是一个容器,它的所有后代(children,children 的 children 等等)也将呈现。

如果您从舞台中删除 object,它及其所有后代将停止渲染 但它们现有的 parent/child 关系保持完好。这意味着如果您再次将带有 children 的容器添加到舞台,所有这些 children 也将再次开始渲染。

因此,为了更准确地回答您的问题:删除容器实际上并不会删除其 children。 children 不会连接到舞台,也不会呈现,但它们仍然是容器children

综上所述,通常没有理由需要从容器中移除每个个体 child。只要 children 没有附加事件侦听器或没有被主应用程序以任何其他方式引用,当它们与舞台的连接被切断时,它们都将有资格进行垃圾回收。从舞台上移除最上面的容器是完全正常的。