加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

学习AS3:delete关键字和类成员

发布时间:2020-12-15 18:33:24 所属栏目:百科 来源:网络整理
导读:delete关键字在Flash中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃圾收集器的工作)。它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引用和使用,也无法再使用for in来枚举。 事实上,垃圾处理器(GC)将在特定的时候,自
delete关键字在Flash中是用来删除定义的变量,但是并不将对象从内存中清除掉(这是垃圾收集器的工作)。它只是将一个变量的引用设置成无效,让内存中的这个对象无法再被引用和使用,也无法再使用for in来枚举。

事实上,垃圾处理器(GC)将在特定的时候,自动的从内存中删除那些不再被引用和使用的变量。比如,你创建了两个对象引用A和B,都指向了对对象ObjectX的引用,如果delete了A,并不会让垃圾收集器把ObjectX从内存中删除,因为B的引用还是指向了这个对象。如果将A和B都delete,则不再有对ObjectX的引用,ObjectX也将被垃圾收集器回收。例如:

var?a:Object?=?new?Object();
var?b:Object?=?a;?//?b和a引用同一个new?Object();
delete?a;
trace(b);?//?输出[object?Object]?-?在内存中还是存在
delete?b;
//?GC将回收object这个特性在Flash8和9(AS123)中几乎都是一样的,但是在Flash8中,GC的一些特性得到改善并能更好的工作。(注意,垃圾收集不是即时的)

虽然GC在AS3中并没有什么本质上的改变,但是因为使用了新的虚拟机,delete关键字的行为有所改变。现在,delete关键字只能针对类的动态属性和非公有成员有效。而在AS1和2中,delete能被用在所有的东西上。

//?ActionScript?2
class?DeleteVarClass?{
????????
????public?var?myVar:Number;
????
????function?DeleteVarClass()?{
????????myVar?=?1;
????????trace(myVar);?//?1
????????delete?myVar;
????????trace(myVar);?//?undefined
????}
}

//?ActionScript?3
package?{
????public?class?DeleteVarClass?{
????????
????????public?var?myVar:Number;
????????????
????????public?function?DeleteVarClass()?{
????????????myVar?=?1;
????????????trace(myVar);?//?1
????????????delete?myVar;
????????????trace(myVar);?//?1
????????}
????}
}在上面的AS3例子中,因为myVar变量是一个公有成员,所以不能用delete来删除这个变量。

尽管在AS3中不能删除类成员,但是如果你想删除一个对象的所有引用,可以通过将变量设置为null来代替delete。如:

myVar?=?null;如果一个对象的所有引用都是null,GC将自动的从内存中删除这个对象。

*Dictionary类

AS3中的Dictionary类(flash.utils.Dictionary)是一个新的AS类。Dictionary类和Object唯一的区别在于:Dictionary对象可以使用非字符串作为键值对的键。例如:

var?obj:Object?=?new?Object();
obj["name"]?=?1;?//?键是字符串"name"
obj[1]?=?2;?//?键是1?(被转换成字符串"1")
obj[new?Object()]?=?3;?//?键是new?Object(),被转传成字符串"[object?Object]"

for?(var?prop:String?in?obj)?{
?????trace(prop);?//?输出:[object?Object],?1,?name
?????trace(obj[prop]);?//?输出:3,?2,?1
}

也就是说,无论用什么类型的变量作为键,都将被转换成字符串。同时,如果你使用了不同的对象作为键,都会北转换成字符串"[object Object]"作为键,因此而指向了同一个数据。例如:

ActionScript?Code:??? var?a:Object?=?new?Object();??? var?b:Object?=?new?Object();??? var?obj:Object?=?new?Object();??? obj[a]?=?1;?//?obj["[object?Object]"]?=?1;??? obj[b]?=?2;?//?obj["[object?Object]"]?=?2;??? for?(var?prop:String?in?obj)?{??? ?????trace(prop);?//?traces:?[object?Object]??? ?????trace(obj[prop]);?//?traces:?2??? }Dictionary类将没有这个限制,你可以将键设置成任何一种数据类型。例如: import?flash.utils.Dictionary; var?a:Object?=?new?Object(); var?b:Object?=?new?Object(); var?dict:Dictionary?=?new?Dictionary(); dict[a]?=?1;?//?dict[a]?=?1; dict[b]?=?2;?//?dict[b]?=?2; for?(var?prop:*?in?dict)?{ ?????trace(prop);?//?traces:?[object?Object],?[object?Object] ?????trace(dict[prop]);?//?traces:?1,?2 }虽然在trace的时候,输出的还是[object Object],但是这个结果是对象的toString的结果。在Dictionary对象中,代表的是不同的对象引用。 注意,这里的prop的类型是*。这是很重要的,因为dict对象中的键可能是任何数据类型的。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读