【发布时间】:2011-07-26 15:45:35
【问题描述】:
这条线
clip.removeChild(clip.getChildAt(0));
完全删除 0 索引处的子剪辑?我在某处读到你应该将所有对该剪辑的引用设置为null,但我的代码中没有其他引用。 0 处的剪辑是通过常规 addChild() 添加的。
【问题讨论】:
标签: actionscript-3
这条线
clip.removeChild(clip.getChildAt(0));
完全删除 0 索引处的子剪辑?我在某处读到你应该将所有对该剪辑的引用设置为null,但我的代码中没有其他引用。 0 处的剪辑是通过常规 addChild() 添加的。
【问题讨论】:
标签: actionscript-3
为了让垃圾收集器刷你的对象,你应该:
-not have any other reference to the object throughout your code
-the object shouldn't be part of any collection (like Array or Vector)
-the current reference should be set to null
请务必特别注意第二个条件,当对象是您无法直接控制的集合的一部分时,最常见的情况是它附加了一个侦听器以及何时是显示列表的一部分。最重要的是,当对象是您可以控制的集合的一部分时,还有其他情况,不要忘记也将其从那里删除。
另外,为了强制垃圾收集器刷你的对象(仅用于测试,而不是生产),你可以使用System.gc(),然后使用System.privateMemory检查内存
【讨论】:
如果您要循环删除它们,请这样做:
while (clip.childNum > 0)
{
var child:MovieClip = clip.getChildAt(0);
clip.removeChild(child);
// remove all listeners
child.removeEventListener(...);
child = null;
}
如果“child”是一个自定义类,您可以调用 kill() 方法来清理您的类/实例中的所有内容。
【讨论】:
不确定,如果剪辑上仍有引用,垃圾收集器可能会破坏对象,请尝试移除事件侦听器并将剪辑引用强制为 null。
【讨论】:
如果您没有引用、没有侦听器或剪辑的任何其他句柄,那么它最终将被垃圾收集。由于 GC 的工作方式,它可能不会立即从内存中删除。但是,您的 DisplayObject 将立即从显示列表中删除。
但是如果你在你的一个课程中做这样的事情:
private var mc:MovieClip = new MovieClip();
private function addClip() : void {
mc.addEventListener(Event.ENTER_FRAME, myListener);
myClass.addChild(mc);
}
然后您需要像这样正确删除mc:
private function removeClip() : void {
mc.removeEventListener(Event.ENTER_FRAME, myListener);
myClass.removeChild(mc);
mc = null;
}
【讨论】:
removeChild() 或removeChildAt。可能是这样的? while(clip.numChildren > 0) { clip.removeChildAt(0); }