4

我的应用程序创建了一个包含几个组的窗口。当窗口关闭时,GC 不会收集窗口及其后代。

Flash Builder Profiler 帮助我找到并删除事件侦听器,直到我无法发现问题的地步,因为它指向从Window.as.

具体来说,比较打开窗口之前和关闭窗口之后的游荡对象,并选择MyWin类(1 个实例):

MyPackageName.MyWin(10 条路径)

10x 以下行:

功能 [savedThis] 569222 GCRoot:是字节:308

单击方法面板中的每个“功能”,我会在每个“功能”的顶部看到以下 10 个:

spark.components:Window:creationCompleteHandler()    Window.as line 2610
spark.components:Window:creationCompleteHandler()    Window.as line 2613
spark.components:Window:creationCompleteHandler()    Window.as line 2616
spark.components:Window:creationCompleteHandler()    Window.as line 2619
spark.components:Window:creationCompleteHandler()    Window.as line 2625
spark.components:Window:creationCompleteHandler()    Window.as line 2639
spark.components:Window:creationCompleteHandler()    Window.as line 2636
Spark.components.supportClasses:SkinnableComponent:attachSkin() SkinnableComponent.as line 694
Spark.components:SkinnableContainer:partAdded()      SkinnableContainter.as line 959
Spark.components:SkinnableContainer:partAdded()      SkinnableContainter.as line 957

所有这些都以某种方式从 MyWin.initialize() 调用。

我已经删除了我的代码创建的每个事件侦听器,并删除了所有转换。但仍然无法弄清楚这个的含义以及我该如何处理窗口。任何帮助,将不胜感激,因为我已经挣扎了几天了。

4

2 回答 2

1
You can try to use 

    System.pauseForGCIfCollectionImminent(1)

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/System.html#pauseForGCIfCollectionImminent%28%29

or try to use 

    System.gc() 

in this way

   private var numCollected; uint = 0;

   private function gCollect(): void
   {
       addEventListeners(Event.ENTER_FRAME, onEFGCollect);
   }

   private function onEFGCollect(event: Event): void
   {
     numCollected++;
     System.gc();
     if(numCollected > 2)
         removeEventListeners(Event.ENTER_FRAME, onEFGCollect);
   }

在那里,我们在不同的框架中使用 System.gc() 两次,因为要收集对象需要将所有对象标记为已收集 - 只有在 System.gc() 之后才能收集对象。

于 2013-07-08T09:58:45.257 回答
0

据我所知,最好的方法是确保对相关窗口的所有引用都设置为空。我以前研究过这个,找不到任何直接的方法让垃圾收集器立即工作。

于 2012-11-06T10:50:54.107 回答