【发布时间】:2011-06-20 21:04:25
【问题描述】:
前几天我在考虑 Flash GC,并提出了一个问题,即引用计数在以下 4 类场景中如何工作(假设 GuiMain 是电影的文档类):
package com.gui {
import flash.display.MovieClip;
public class GuiMain extends MovieClip {
private var button1Handle:Button1;
public function GuiMain() {
// constructor code
button1Handle = new Button1();
addChild(button1Handle);
killButton1();
}
public function killButton1(){
removeChild(button1Handle);
button1Handle = null;
}
}
}
package com.gui {
import fl.controls.Button;
import flash.display.*;
public class Button1 extends Sprite {
private var button2Handle:Button2;
private var tester:Test;
public function Button1() {
// constructor code
button2Handle = new Button2();
tester = new Test();
}
}
}
package com.gui {
public class Button2 {
public function Button2() {
// constructor code
}
}
}
package com.gui {
import flash.display.MovieClip;
import flash.events.Event;
public class Test extends MovieClip{
public function Test() {
// constructor code
addEventListener(Event.ENTER_FRAME, yellLoudly);
}
public function yellLoudly(e:Event){
trace("AAAH!!!");
}
}
}
当在 Button1 中创建 Button2 和 Test 实例时,我希望它们的引用计数器会增加。问题是,当创建它们的 Button1 对象从显示列表中删除并清空时,它们的引用计数器是否会相应减少?我测试了这段代码,Test 类中的事件监听器似乎关闭了,但这并不一定意味着它或 Button2 实例有资格进行 GC。即使是,也可能只是在 Mark and Sweep 下,这比基于引用计数的 GC 慢。
一个明显的解决方案是让 Button1 类从它所做的/空引用中删除侦听器,当它需要被删除时,如下所示:
package com.gui {
import fl.controls.Button;
import flash.display.*;
public class Button1 extends Sprite {
private var button2Handle:Button2;
private var tester:Test;
public function Button1() {
// constructor code
button2Handle = new Button2();
tester = new Test();
}
public function destroyRefs(){
button2Handle = null;
tester.removeEventListener(Event.ENTER_FRAME, tester.yellLoudly);
tester = null;
}
}
}
但是在一个真正的程序中,我可能会处理来自不同类的对同一对象的多个引用(通过在构造函数中传递原始引用)不会将一个类中的引用设置为 null 导致 all 的值对同一对象的其他引用也变为空?那肯定是不可取的……
主要问题如下:当对 Button1 的唯一引用被清空时,它所引用的所有对象的引用计数器是否都会减少(立即或当 Button1 对象被垃圾回收时)?强>
另外,有没有办法通过 Flash 调试器查看实时存在的对象的所有实例和/或其引用计数值?像这样的详细分析器确实有助于解决这些问题......
谢谢, CCJ
【问题讨论】:
-
啊!你必须对这种格式做点什么!
-
我是不是错过了什么,你在哪里添加测试人员到舞台?
-
测试者不必添加到显示列表中;它的唯一目的是用明确的文本填充调试控制台。
标签: flash apache-flex actionscript-3 garbage-collection