前日,一个朋友使用flex Arra时碰到了一个问题,百思不得其解。问题是大概是这样的:
var arr1:Array = new Array();
var arr2:Array = new Array();
for(var i:int = 0; i < n; i++)//for 循环
{
arr1 = getArray(i);//返回一个array
arr2[i] = arr1;//(*)
}
trace(arr2);//输出结果每行都是最后一个arr1
其实这个问题主要是这位朋友习惯使用C++而造成的。在C++中,我们d定义了一个变量,改变它某一时刻的值,并不会影响到他以前保存的值。但在flex中不一样。flex对于除基础类型(int,Boolean之类的)之外,都是按引用操作。所以(*)这个步骤,其实每次都是往arr2中放入arr1的一个内存地址的拷贝(暂时先这么说吧,我也不知道flex内部的机制是否这样,大概是这个意思)。因此,arr2的每一行指向的其实都是同一个内存,当循环结束后,当然arr2中的内容都同最后一个arr1一样。
了解了这个缘由,那么便很容易解决了。
var arr1:Array;
var arr2:Array = new Array();
for(var i:int = 0; i < n; i++)//for 循环
{
arr1 = new Array();//每次new一个arr1
arr1 = getArray(i);//返回一个array
arr2[i] = arr1;//(*)
}
David Cai 09-08-16早 于金山公司