数组、对象、内存。动作脚本

Array, Object, Memory. Actionscript

我有一个关于记忆的问题。我将举一个例子来说明现在一切是如何工作的。

我有 2 个数组:

var ArrayNew:Array = new Array();
var ArrayOld:Array = new Array();

我还有一个 class 来存储我的对象(3 个属性)。例如:

public Id {get; set;}
public Name {get; set;}
public Type {get; set;}

问题是,我每隔(例如 12 小时)用新对象填充 ArrayNew:

ArrayNew.push(x, x, x)
.....
ArrayNew.push(x, x, x)

可能大约有 ~200 条记录,甚至更多。 之后我做了这个:

ArrayOld = ArrayNew;
ArrayNew = null;

所以问题是,内存在这种情况下如何工作以及对象会发生什么情况? ArrayOld = ArrayNew 是否复制对象(因为现在它可以工作)? ArrayNew=null 是否删除创建的对象? 我希望你不了解情况。 :)

如果我没理解错的话,你想知道 ArrayOld 发生了什么事。

我的代码:

var arr_1:Array = ["Hello world!"];
var arr_2:Array = ["My name is Stas!"];

arr_2 = arr_1;
arr_1 = null;

trace(arr_2);// Hello world!

如果我对问题的理解有误,请正确解释。

如果没有其他引用,存储在 arrayOld 中的对象将被垃圾回收。来自 arrayNew 的那些不会被复制——它们在赋值后被 arrayOld 引用。

也就是说之后:

arrayNew[0].name = 'a random silly text';
arrayOld = arrayNew;
arrayOld[0].name = 'another silly string';
trace(arrayNew[0]);

你会得到:

another silly string

样式注释: 通常你不会以大写开头 variable/object 名称,这是为 类 保留的。

ArrayOld = ArrayNew 只是让 ArrayOld 引用与 ArrayNew 相同的东西。不会复制内存中的实际数据。

ArrayNew = null 只是将空值分配给 ArrayNew 引用。它不会删除之前引用的数据 ArrayNew,也不会影响对该数据的其他引用(例如 ArrayOld)。

此时,ArrayNew用来引用的原始数据并没有发生任何变化,你只是传递了引用它的变量。

此时如果你做了ArrayOld = null,那么内存中的原始数据不再有任何引用,它最终会被垃圾收集清除,但不会马上清除。它会在运行时决定方便的时候发生 "later"。