考虑一个 AIR 应用程序,它可以一次加载任意数量的第三方 SWF 文件以进行显示。就像一个网络浏览器。
问题是这些 SWF 文件可能具有尚未删除的 EventListener 等。
Loader.unloadAndStop() 是否足以垃圾收集这些 SWF?
如果没有 - 是否有一种方法可以(可能每个 SWF 都有一个新的 NativeWindow,然后在完成后关闭 NativeWindow。这会完全 GC 吗?)
考虑一个 AIR 应用程序,它可以一次加载任意数量的第三方 SWF 文件以进行显示。就像一个网络浏览器。
问题是这些 SWF 文件可能具有尚未删除的 EventListener 等。
Loader.unloadAndStop() 是否足以垃圾收集这些 SWF?
如果没有 - 是否有一种方法可以(可能每个 SWF 都有一个新的 NativeWindow,然后在完成后关闭 NativeWindow。这会完全 GC 吗?)
单独的本机窗口或在浏览器控件中加载可能是您无法控制的第三方 SWF 的一种方式。否则这会增加很多开销。
不幸的是,您无法确保加载代码的正确沙盒(显示对象,最重要的是,阶段不能从加载的代码中隐藏)。如果加载的代码在舞台上添加了一个侦听器(如果您需要键盘事件,这很常见),那么它将不会卸载。
然而,这在 SWF 格式本身不同的移动设备上是不可能的。
不久前,我在没有源代码的外部开发组件中遇到了类似的问题,它被夹在了我们的应用程序中。我能做/想到的最好的事情就是做核工业所做的事情——当事情变糟时,至少将它包含在混凝土中,这样它就不会传播得比它必须的更多。
我的解决方案是建立一个“组件池”,这样当被污染的对象被要求“清洁”时,它们被放在一个单独的存放区域中,以便在需要时重复使用——这样在运行期间只创建了所需的最少数量会议。
在 GC 之前,您应该创建一个公共静态函数来删除加载的 swf 文件中的所有侦听器。