如果您从显示列表中删除一个MovieClip,并且该MovieClip又有子MovieClip,这些子MovieClip又有自己的事件侦听器,那么是否需要从所有子MovieClip中删除所有侦听器呢?
还是只需要从直接从显示列表中删除的父MovieClip中删除?
还是只需要从直接从显示列表中删除的父MovieClip中删除?
它取决于侦听器是否附加到父级或子级MovieClips,并且是否具有指向它的弱引用。
当您添加侦听器时,可以使用最后一个参数设置侦听器是否使用弱引用。这正是您需要了解的问题。
//This listener will use a weak reference, notice the last "true"
something.addEventListener("event", myFunction, false, 0, true);
//This is called a weak reference listener.
//The ussual listener, with default parameters, is a strong refence listener.
如果所有指向某个对象的引用都被删除,那么该对象将被垃圾回收。使用默认参数添加的侦听器会计入这些引用(因为最后一个参数的默认值为false
)。因此,如果在MovieClip及其子项中添加了强引用侦听器,则通过将其从显示列表中移除,该剪辑将不会被垃圾回收,直到侦听器引用也被删除(使用removeEventListener
方法)。
如果在剪辑或其任何子项中使用弱引用,则通过将其从显示列表中移除,它最终将被垃圾回收。请注意,这可能需要一些时间,因此像ENTER_FRAME
之类的事件可能仍然会被触发和调用,直到对象最终被收集。
我认为只需要使用removeChild(MC)然后MC=null或者删除MC,如果你阅读了Adobe的规范,我猜想delete也可以完成这项工作,我认为你也可以调用System.gc但这是针对AIR应用程序的。
delete
用于从对象中删除动态属性。尽管它会删除属性内容的引用,但由于其具有非常特定的范围和用途,因此使用它是不寻常的。http://livedocs.adobe.com/flex/3/langref/operators.html#delete - Maic López Sáenz