ActionScript中的不变对象及数组的深拷贝

来源:互联网 发布:恶意知乎 编辑:程序博客网 时间:2024/06/08 18:52

一、不变对象:
在ActionScript3中,因为本质上,值类型仍然是对象,那么,即使是值类型对象,存储的仍然是引用,而不是直接持有值。但是,值类型是一种特殊的对象,叫做不变对象(immutableobject)。它一旦被建立后,就不能再被更改。有些操作看起来似乎似更改了不变对象中的内容,但实际上不是。一旦虚拟机发现指向一个不变对象的引用要改变该不变对象的值,就会另行创建一个新的不变对象来接受新的值。如:
var i:int = 1;
i = i + 2;
先创建了一个不变对象A,值为1,并赋给了变量i,第二行的结果导致了一个新的整型值不变对象B被创建,B的值为3,然后B的引用被赋值给了i。换句话说,此时i持有的引用不再指向不变对象A,而是指向B,A如果不在被使用,会被AVM自动回收。
字符串在ActionScript3中是以不变对象的形式存在的。一个字符串对象一旦被创建,其值就被确定不会被更改。这使得一个字符串对象可以被共享,以降低对内存的消耗。如:
var a:String = "I";
var b:String = a;
a += "like actionscript";
trace(a); 

   //输出:I like actionscript
trace(b);    //输出: I
第一行创建了一个String对象s,值为“I”,第二行新建了一个变量b,将a的引用附给b,此时a和b都指向同一字符串对象“I”,第三行将一个新的字符串对象“likeactionscript”添加到变量a所指的字符串上。
因为字符串是不对对象,因此第三行并没有改变不变对象s的值,而是新创建出来一个字符串对象“I likeactionscript”,并将其赋值给了变量a。也就是说,从这一刻起,其实a和b所指向的字符串对象已经不一样了。

二、数组的深拷贝:
生成数组浅拷贝的方法很简单,只需要调用原数组的slice或者concat方法,不传任何参数,即可生成原数组的浅拷贝。如:
var copy:Array = originalArray.concat();
var copy:Array = originalArray.slice();
使用深拷贝生成的数组,其所有元素都是真正的原数组元素的备份。这时两个数组中相同位置的元素,存放的是不同的引用,指向不通的对象了,但是这两个对象的状态是完全一致的。
需要使用ByteArray类来生成深拷贝。如:
var object:Object = {name:"air", id:"flash"};
var array:Array = [1, 2, 3];
var foo:Array = ["a string", array, object];
//以下4行实现深拷贝数组foo
var fooDeep:ByteArray = new ByteArray();
fooDeep.writeObject(foo);
fooDeep.position = 0;
var var:Array = fooDeep.readObject() as Array;

转载请留原文链接:http://blog.csdn.net/parine26/archive/2009/09/08/4532654.aspx
原创粉丝点击