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

Posted

技术标签:

【中文标题】数组、对象、内存。动作脚本【英文标题】:Array, Object, Memory. Actionscript 【发布时间】:2015-03-11 11:48:23 【问题描述】:

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

我有 2 个数组:

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

我还有一个类来存储我的对象(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 是否删除创建的对象? 我希望你了解情况。 :)

【问题讨论】:

【参考方案1】:

如果没有其他对它们的引用,则存储在 arrayOld 中的对象会被垃圾回收。来自 arrayNew 的那些不会被复制 - 它们在分配后由 arrayOld 引用。

就是说之后:

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

你会得到:

another silly string

样式说明:通常你不会用大写来开始变量/对象名称,它是为类保留的。

【讨论】:

我知道。我只是写了一个例子。没有发现我是从 Capitals 开始的 :)【参考方案2】:

如果我理解正确,您想知道 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!

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

以上是关于数组、对象、内存。动作脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 If 语句以检查数组中的某些对象。 Flash CS5 动作脚本 3

动作脚本 3. 如何检查数组的当前元素是不是有准确的名称?

动作脚本 3. 检查数组是不是有任何元素不跳转,然后跳转

如何在 Haxe 中创建动作脚本对象

Adobe Flex 动作脚本 - 响应对象

将类转换为对象动作脚本 3