Flash 如何正确移除和检查对象的移除

Flash 如何正确移除和检查对象的移除,flash,actionscript-3,garbage-collection,Flash,Actionscript 3,Garbage Collection,在使用AS3时,我注意到一些危险的东西——一些对象,即DisplayObjects/MovieClips,往往会保留在内存中,甚至在删除所有对它们的引用后执行操作 我使用Flash CS 5.5和Flash Builder 4.6 除去所有引用(包括removeChild)后。。。从Document类中,有些对象似乎保持活动状态 这个问题可能有点宽泛,但我想了解的是,我能做些什么来确保垃圾收集器拾取一个对象? 更重要的是,我如何从GC获得某种反馈,表明某个对象已被销毁?例如,控制台消息 提前感谢

在使用AS3时,我注意到一些危险的东西——一些对象,即DisplayObjects/MovieClips,往往会保留在内存中,甚至在删除所有对它们的引用后执行操作

我使用Flash CS 5.5和Flash Builder 4.6

除去所有引用(包括removeChild)后。。。从Document类中,有些对象似乎保持活动状态

这个问题可能有点宽泛,但我想了解的是,我能做些什么来确保垃圾收集器拾取一个对象? 更重要的是,我如何从GC获得某种反馈,表明某个对象已被销毁?例如,控制台消息


提前感谢。

从stage中删除对象、删除事件侦听器并将所有引用设置为null应该足够了-GC将在下次执行时拾取它

但是,跟踪所有引用是很枯燥的,记住这包括事件侦听器,除非您将useWeakReference设置为true,如果您没有标准的方法来执行它。。。建议在每个类中都有一个析构函数,当不再需要对象时,它负责清理所有变量和事件侦听器

您也可以将这些与事件结合起来-我开始认为在Event.ADDED_到_STAGE上执行init函数和Event.remove_从_STAGE上执行destroy函数是一种很好的做法。这样,您就有了一个明确定义的舞台对象生命周期,如果您确保销毁方法停止所有动画和声音,删除所有子级和事件侦听器,并将所有成员变量字段设置为null,那么您就可以非常确定不再有任何活动会产生不必要的副作用

顺便问一下——如果你真的注意到你移除的对象的任何活动,某些引用肯定仍然完好无损——你还能怎么分辨呢

尽管如此,仍然无法确切地知道GC何时会提取一个丢弃的对象——这是由VM管理的,完成后您将不会收到消息。而且,思考何时释放内存不应该是你的责任——毕竟,这正是垃圾收集器被发明的目的


如果你养成了自己清理的习惯,你的程序将不可避免地变得更稳定,消耗更少的内存,最终表现会更好。这才是最重要的。

从stage中删除对象、删除事件侦听器并将所有引用设置为null应该就足够了-GC将在下次执行时拾取它

但是,跟踪所有引用是很枯燥的,记住这包括事件侦听器,除非您将useWeakReference设置为true,如果您没有标准的方法来执行它。。。建议在每个类中都有一个析构函数,当不再需要对象时,它负责清理所有变量和事件侦听器

您也可以将这些与事件结合起来-我开始认为在Event.ADDED_到_STAGE上执行init函数和Event.remove_从_STAGE上执行destroy函数是一种很好的做法。这样,您就有了一个明确定义的舞台对象生命周期,如果您确保销毁方法停止所有动画和声音,删除所有子级和事件侦听器,并将所有成员变量字段设置为null,那么您就可以非常确定不再有任何活动会产生不必要的副作用

顺便问一下——如果你真的注意到你移除的对象的任何活动,某些引用肯定仍然完好无损——你还能怎么分辨呢

尽管如此,仍然无法确切地知道GC何时会提取一个丢弃的对象——这是由VM管理的,完成后您将不会收到消息。而且,思考何时释放内存不应该是你的责任——毕竟,这正是垃圾收集器被发明的目的


如果你养成了自己清理的习惯,你的程序将不可避免地变得更稳定,消耗更少的内存,最终表现会更好。这才是最重要的。

@weltraumpirat当然有一些好主意,创建init/destroy循环作为一种工作实践是一个好办法。还有其他问题,你可能需要考虑。

创建新对象可能需要耗费大量CPU,因此根据应用程序的实际功能,使用一揽子初始化/销毁方法可能不是最好的方法。您可能需要考虑创建一个对象池并在整个应用程序中循环使用它们。 这是一篇很好的文章和工具,可以让您跟踪应用程序中的对象,以查看在任何时间点哪些对象仍有对它们的引用


@weltraumpirat当然有一些好的想法,并将创建init/destroy循环作为一种工作实践 这是一个很好的选择。还有其他问题,你可能需要考虑。

创建新对象可能需要耗费大量CPU,因此根据应用程序的实际功能,使用一揽子初始化/销毁方法可能不是最好的方法。您可能需要考虑创建一个对象池并在整个应用程序中循环使用它们。 这是一篇很好的文章和工具,可以让您跟踪应用程序中的对象,以查看在任何时间点哪些对象仍有对它们的引用


底部的有趣文章和相关文章:底部的有趣文章和相关文章:是的,当您处理大量相同类型的对象时,对象池非常有意义,并且您必须经常创建/销毁它们-例如粒子动画或类似内容。不过,在重用实例之前,您仍然需要中和实例,即删除所有侦听器并重置字段值。诚然,当您处理大量同类对象时,对象池非常有意义,并且您必须经常创建/销毁它们,例如粒子动画等。不过,您仍然需要中和实例,即在重用它们之前删除所有侦听器并重置字段值。