flex delete关键词和类成员

flash中delete关键词用来移除定义的变量,并不能从内存删除,(从内存删除由"垃圾收集器"来完成),delete只是除去创建的变量,这样别的对象无法访问到它,也无法通过for...in等循环来显示变量.
实质上,Garbage Collector,简称GC,当对象没有任何引用时,GC就会物理地从内存中删除此对象.比如,有两个变量A和B,它们都是引用ObjectX,删除A,GC并不会从内存中删除ObjectX,因为此时它还有B这个引用,如果删除了A和B,ObjectX就没有了引用,GC就会认为它应该从内存中删除了.

var a:Object = new Object();
var b:Object = a; // reference same new Object();
delete a;
trace(b); // [object Object] - still exists in memory
delete b;
// GC will mark object for deletion from memory

实际上,在AS1,AS2和AS3中上述工作原理是基本相同的,只是在flash 8中GC有了一点变化,(注意:用GC从内存中删除并不是直接发生的).
尽管有AS3中,有了新的虚拟机来运行脚本,但GC没有太大的实质的变化 ,而delete操作倒是有了些变化.在AS3中,delete只能删除类实例中的动态创建的属性, 但是不能删除类成员(类中变量和方法),在AS1和AS2中,delete可以操作任何东西.AS3缩小了范围,只充许操作动态变量.

Actionscript Code:

// Actionscript 2
class DeleteVarClass {

public var myVar:Number;

function DeleteVarClass() {
myVar = 1;
trace(myVar); // 1
delete myVar;
trace(myVar); // undefined
}
}

Actionscript Code:



// Actionscript 3
package {
public class DeleteVarClass {

public var myVar:Number;

public function DeleteVarClass() {
myVar = 1;
trace(myVar); // 1
delete myVar;
trace(myVar); // 1
}
}
}

上面例子中变量myVar是类定义的一部分,所以在AS3中不能用detele删除它.
AS3中如果要让一个类成员变量在内存中不再引用某个对象或者某个值,可以把这个变量值设为null来删除它.
Actionscript Code:

myVar = null;

如果对象的所有引用全为null,GC就会标记它为要删除的对象,最后会从内存中删除这个对象

你可能感兴趣的:(虚拟机,Flex,脚本,Flash,actionscript)