【问题标题】:Will the contents inside the Array garbage collected when we do someArray = []当我们做someArray = []时,Array里面的内容会被垃圾回收吗
【发布时间】:2015-03-18 06:43:41
【问题描述】:

someArray 中有一些项目。 所以 someArray.splice(0) 和 someArray = [] 做同样的事情就是让 someArray 为空。

someArray.splice(0) 比 someArray = [] 花费更多的时间。

通过someArray = [],someArray里面的内容会被垃圾回收吗?

【问题讨论】:

标签: actionscript-3 garbage-collection


【解决方案1】:

如果没有其他变量持有指向某些数组元素的指针,它会。 例如,

var a:Array = [new Object(), new Object(), new Object()];
var b:Object = a[1];
a = [];

a[0]a[2] 将被垃圾回收,a[1] 不会,因为变量 b 持有对它的引用。

【讨论】:

    【解决方案2】:
    array = []; 
    

    创建一个新的空而不是清除,因此垃圾收集器让它活着,需要使用:

    array.length = 0; // or array.splice(0);
    

    因为您可能有对数组的引用,它们也需要更新

    先检查:

    var someArray:Array=[1,2,3];
    var copyOfSomeArray:Array=someArray;
    someArray=[];
    trace (copyOfSomeArray); //gives 1,2,3
    

    现在是这样的:

    var someArray:Array=[1,2,3];
    var copyOfSomeArray:Array=someArray;
    someArray.length = 0;
    trace (copyOfSomeArray); //gives nothing
    

    最后别忘了为垃圾收集器显式地清空数组。

    someArray=null;
    

    【讨论】:

    • 第一个示例的说明: someArray 和 copyOfSomeArray 引用相同的内存区域。你已经取消引用 someArray 但仍然 copyOfSomeArray 仍在引用,所以这样做 someArray = [];//这会为 someArray 创建一个新的内存区域。 trace(copyOfSomeArray)//给出 1,2,3;因为 copyOfSomeArray 仍在引用 var someArray:Array=[1,2,3];解释你的第二个例子,因为两者都引用相同的内存区域,你改变另一个会受到影响。 so someArray.length = 0;//也会影响copyOfSomeArray。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多