【问题标题】: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 是否删除创建的对象? 我希望你了解情况。 :)

【问题讨论】:

    标签: arrays object memory actionscript


    【解决方案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,那么内存中的原始数据不再有任何引用它,它最终会被垃圾回收清除,但不是马上。它会在运行时决定方便时“稍后”发生。

      【讨论】:

        猜你喜欢
        • 2012-05-04
        • 2017-09-26
        • 1970-01-01
        • 2013-04-13
        • 2017-05-13
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多