垃圾回收最佳实践

3
如果您从显示列表中删除一个MovieClip,并且该MovieClip又有子MovieClip,这些子MovieClip又有自己的事件侦听器,那么是否需要从所有子MovieClip中删除所有侦听器呢?
还是只需要从直接从显示列表中删除的父MovieClip中删除?

我对AS3的工作经验不多,但是假设Stage实际上是一个具有其他子节点[电影剪辑]的节点,如果它们的父节点从舞台中分离,那么这些子节点就不应该被渲染。 - Warty
问题的标题过于模糊或笼统。也许可以改为:一个对象要被垃圾回收,必须先移除其所有的监听器? - Maic López Sáenz
2个回答

3

它取决于侦听器是否附加到父级或子级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之类的事件可能仍然会被触发和调用,直到对象最终被收集。


-1

我认为只需要使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接