關於flash中的垃圾回收

来源:互联网 发布:大连金斧子软件 编辑:程序博客网 时间:2024/05/17 00:51

看了Luar的 神秘的Garbage Collection , 略有不同意見

var ref1:Object = new Object();
ref1.name = "Luar";
ref2 = ref1;            // 複製新Reference到另一個Variable
delete ref1;            // 然後刪除ref1
trace(ref1.name);    //output: undefined
trace(ref2.name);    //output: Luar

我沒有學過面向對象語言,我只學過C,上面的代碼在我看來是符合GC的規則的。
上面代碼所做的事情是:

1, 用 new Object() 生成一個匿名對象,返回該對象在内存中的位置(C裏面的指針)
如果沒有下面的步驟,這個對象將很快被flash黨作垃圾回收,即這樣的代碼是沒有意義的:

new Object();
但他實際上是符合actionscript的語法的。

2,創建一個 ref1變量,並讓ref1值為上面匿名對象的内存地址
3,創建一個 ref2變量,並讓ref2值為ref1的值——實際上就是匿名對象的内存地址
隨後ref2和ref1並沒有直接關係,他們只是指向同一個地址,所以刪除ref1/ref2並不會影響到ref2/ref1。
4,delete ref1; 的作用:如果沒有ref2的出現,上面的匿名對象只被ref1引用,儅ref1被delete,這個匿名對象就會消失;而ref2的出現,使ref1被delete之後仍然有引用指向該匿名對象,所以這個對象不會被回收,ref2也繼續有效。


同樣的道理也適用于function的時候,function(){} 也是產生一個匿名函數對象,返回一個指針。
有些咬文嚼字了,呵呵,不過我理解的垃圾回收就是這樣的。

至於MovieClip的回收,確實不符合垃圾回收的規則,在Moock的權威指南中也有論述,贊同Luar的看法。