我正在使用几乎完全用ActionScript 3编写的Flex / Air应用程序(使用PureMVC)(即我们使用很少的Flex)。视图组件被添加到主应用程序窗口中的Canvas对象,然后这些视图加载其他影片剪辑,图像文件等。
当我从舞台中删除视图时,我使用application.canvas.removeChild(...)
这样做。这会在我的PureMVC中介中为该视图触发一个事件,该事件将删除所有已设置的事件侦听器,并且所有内容都显示为花花公子。
但是,影片剪辑仍在后台播放。它们不会在屏幕上造成任何麻烦...但它们只是在那里,在内存中播放(例如我可以看到它们的trace
语句)并且我希望它们消失。我怀疑从Canvas中删除的View仍然存在,但我无法证明它。
将视图设置为null
不会执行任何操作。我很惊讶AS3没有包含任何方法来简单有效地销毁显示对象及其所有子节点。
这是唯一的方法来繁琐地卸载所有的电影剪辑等,然后希望Flash能够清理它们吗?
答案 0 :(得分:2)
AS3是一种垃圾收集语言,因此没有明确的命令从内存中删除对象。但是,AS3 VM确实进行引用计数,因此如果从阶段中删除显示对象并删除对该对象的所有引用,该对象将立即或很快被销毁,因此您将不会更长时间看它的跟踪陈述等。
如果您已删除对象的所有明显引用但未收集,则问题可能是循环引用。例如,父对象和子对象相互引用,因此上述处理将不会知道删除它们,除非您取消所有内容。在这些情况下,在发生垃圾收集(即标记扫描)之前,不会从内存中删除对象。 (GC相对较慢,因此玩家内部基于可用内存量和其他因素进行优化。)
顺便提一下,以上所有所有对象都是如此,无论它们是显示对象还是Flex Views或NetStreams等等。有关AS3 GC的here's a good overview的更多信息 - 它已经过时但仍然正确。
但是作为一名程序员,你应该理解的是,几乎在所有情况下,你都不应该担心这一点。删除所有对象的引用(如果它们正在播放,则为stop()
),让(经过大量优化的)内部GC决定它们何时实际消失。如果内存变得稀缺,那么GC将会起作用,如果没有,那么任何额外的内存管理都只是过早的优化。
答案 1 :(得分:0)
这里有两件事
根据flash播放器的版本,你有各种unloadAndStop类型的soundmixer类stopAll方法和方法。
只有在退出整个应用程序时,清理工作才会出现。