gpt4 book ai didi

flash - 如果一个对象在 Flash 中被垃圾回收,它引用的对象的引用计数器会自动递减吗?

转载 作者:行者123 更新时间:2023-12-04 06:22:13 24 4
gpt4 key购买 nike

前几天我在考虑 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 导致所有其他引用的值同一个对象也变成空了?那肯定是不受欢迎的......

主要问题如下:当对 Button1 的唯一引用被清空时,它引用的所有对象的引用计数器是否都会递减(立即递减或当 Button1 对象被垃圾回收时)?

另外,有没有办法通过 Flash 调试器查看实时存在的对象的所有实例和/或其引用计数值?像这样的详分割析器真的有助于解决这些问题......

谢谢,
CCJ

最佳答案

无耻的自我宣传,但这应该可以帮助您:http://divillysausages.com/blog/tracking_memory_leaks_in_as3

关于flash - 如果一个对象在 Flash 中被垃圾回收,它引用的对象的引用计数器会自动递减吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6417503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com