数组、对象、内存。动作脚本
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
,那么内存中的原始数据不再有任何引用它,它最终会被垃圾回收清除,但不是马上。它会在运行时决定方便时“稍后”发生。
【讨论】:
以上是关于数组、对象、内存。动作脚本的主要内容,如果未能解决你的问题,请参考以下文章