AS3内存管理

时间:2016-11-01 15:01:16

标签: actionscript-3 flash memory garbage-collection

我对as3内存管理有疑问。

例如,如果我有课

public class CustomizationScreen extends MovieClip {
       private var a:Display;
       public var b:Buttons;
       public function CustomizationScreen() {
           a = new Display(200,-20);
           b = new Buttons(900,-100,"Next");
           addChild(a);
           addChild(b);
       }
}

我在主类

中实例化该类
public class Main extends MovieClip {
   public var c:CustomizationScreen;
   public function Main() {
       c = new CustomizationScreen(200,-20);
       c.b.addEventListener(Event,func);
       addChild(c);
   }
   // func
}

这是否足以让c对象被垃圾收集?

c.removeEventListener(Event,func);
removeChild(c);
c=null;

或者我还需要从c?

中删除a和b对象

2 个答案:

答案 0 :(得分:1)

正如您应该知道的那样,垃圾收集不是一个正常运行的过程,也不会完成,直到分配了有价值的内存。

The red line is our maximum allowed memory, then garbage called

但是关于对象的垃圾能力最重要的一点是,你的对象中不得留下任何与你课堂外的其他对象交流的处理程序。例如,必须正确删除事件侦听器。

另请参阅本文 https://code.tutsplus.com/tutorials/understanding-garbage-collection-in-as3--active-4412

回答你的主要问题:
是。你的课将成功垃圾收集!!

答案 1 :(得分:1)

您应该在类中定义c而不是函数

  public class Main extends MovieClip {

       private var c:CustomizationScreen;

       public function Main() {
            c = new CustomizationScreen(200,-20);
            c.b.addEventListener(Event,func);
            addChild(c);
       }

  }

你需要删除c.b上的eventListener,而不是c。

public function dispose():void
{
     c.b.removeEventListener(Event,func);
     removeChild(c);
     c=null;
}

如果有来自其他类的a和b的引用,你最好在CustomizationScreen中将a和b设置为null。