Actionscript 3 空气中的垃圾收集第三方SWF

Actionscript 3 空气中的垃圾收集第三方SWF,actionscript-3,flash,apache-flex,air,Actionscript 3,Flash,Apache Flex,Air,考虑一个AIR应用程序,它可以一次加载任意数量的第三方SWF文件以供显示。就像一个网络浏览器 问题是这些SWF文件可能有尚未删除的EventListener等 Loader.unloadAndStop()是否足以垃圾收集这些SWF 如果没有-是否有一种方法(可能为每个SWF创建一个新的NativeWindow,然后在完成后关闭NativeWindow。这是否完全是GC?您应该创建一个公共静态函数来删除加载的SWF文件中的所有侦听器)在GC它之前。单独的本机窗口或在浏览器控件中加载可能是您无法控制

考虑一个AIR应用程序,它可以一次加载任意数量的第三方SWF文件以供显示。就像一个网络浏览器

问题是这些SWF文件可能有尚未删除的EventListener等

Loader.unloadAndStop()是否足以垃圾收集这些SWF


如果没有-是否有一种方法(可能为每个SWF创建一个新的NativeWindow,然后在完成后关闭NativeWindow。这是否完全是GC?

您应该创建一个公共静态函数来删除加载的SWF文件中的所有侦听器)在GC它之前。

单独的本机窗口或在浏览器控件中加载可能是您无法控制的第三方SWF的一种方式。否则会增加很多开销

不幸的是,您无法确保正确地对加载的代码进行沙箱处理(最重要的是,不能对加载的代码隐藏显示对象stage)。如果加载的代码向stage添加了一个侦听器(如果需要键盘事件,这是一个常见的操作),那么它将不会卸载


然而,这在移动设备上是不可能的,因为SWF格式本身是不同的。

不久前,我遇到了一个类似的问题,即外部开发的组件,我们没有源代码,它被夹在我们的应用程序中。我所能做/想到的最好的事情就是做核工业所做的事情——当事情变坏时,至少要用混凝土把它包起来,这样它就不会扩散得太多


我的解决方案是建立一个“组件池”,以便在要求“清洁”受污染对象时,将其放在一个单独的等待区,以便在需要时重新使用-这样,在运行会话期间,只创建了所需的最小数量。

如原问题中所述,这些是针对第三方主权财富基金的,也就是说,即使第三方SWF做了最糟糕的事情,我也不知道或无法控制NativeWindow中的侦听器。您可以调查覆盖addEventListener以保留侦听器列表。但是,如果对象正在侦听阶段,您可能很难用自己的阶段实例覆盖默认的阶段实例。这是否会在外部内容中包含内存泄漏?如果您的应用程序只使用受影响区域的最小值,则是。例如,在那个项目中,我们基于模板中的页面构建了一个CMS。使用标准方法,一个页面将被拆掉,并在其位置构建一个“新”页面,用于新请求。使用池方法,如果您已经创建了3个,并且持有它的引用,现在请求5个,那么只会再生成2个“新的”。因此,泄漏量取决于使用情况,但它通常将自身建模为ln(e)。我的理解是,无法控制内存泄漏的已加载资产(您无法控制其来源)的使用,并且可能会增长。此外,在cms的示例中,当您打开包含元素时,可能需要重置一个资产,并且重置只能通过重新加载可靠地进行。在这种特定情况下,探查器和游荡对象视图都确认,当内存上升时,它不会随“冲洗重复”的每次连续操作而任意上升。它只会随着对一个新的污染物体的一个连续的请求而上升,而这个新的污染物体是它所没有的。在这种情况下,重置任何现有数据都很容易,因为与之交互的方法与创建并设置数据的方法相同。每个元素都是不同的,但我们处理的视图并不像在mouse.move事件中添加另一个侦听器那样明显。