是否在AS3中的函数末尾丢弃了函数中定义的数组?

时间:2011-07-06 07:29:41

标签: arrays flash actionscript-3

好奇的问题:

采取此功能:

function something():Array
{
    var ar:Array = [];

    var i:MovieClip;
    for each(i in list)
        ar[ar.length] = i.x;

    return ar;
}

ar会被丢弃,还是继续冷却我的记忆,每次调用此函数时都会增加使用的内存?

我的问题适用于以下每种情况:

  1. var val:Array = something();(显然val存储在内存中,但是在函数中创建的原始数组呢?)
  2. something();
  3. 总是这样做会更安全吗?:

    return ar.slice();
    

2 个答案:

答案 0 :(得分:2)

垃圾收集由闪存引擎自动完成。然而,它并非即时完成。在flash中,任何未引用的都将是GC。

[有关详细信息,请参阅http://www.adobe.com/devnet/flashplayer/articles/garbage_collection.html]

因此,对于'something()'

的功能案例
for(var i:int = 0; i<100; i++) {
    something();
}

生成的100个左右的阵列在被GC清除之前可能会“慢慢”几毫秒(变化)。然而...

var stupidArr:Array = [];
for(var i:int = 0; i<100; i++) {
    stupidArr.push( something() );
}

只要变量'stupidArr'存在,您的100个左右数组将保持不变。但是,如果下次发生这种情况。

stupidArr = null;

OR

stupidArr.pop(); //Looped as desired

只要你的函数'something()'中的数组没有被反映(用每个pop清除,或者完成null)。通过您可以访问的变量。该项目将免费用于GC。因此会留下记忆。

所以你的函数“Array.slice()”实际上是一个坏主意,因为它会使GC之前的内存消耗加倍(影响性能)

另一方面,如果我们说你的函数有无用的变量,例如:你的循环计数器。如果他们在一天结束时没有被重新考虑,这些也是GC。对于flash,因此变量和垃圾收集“非常简单”。只知道这个经验法则。

  

如果以任何可能的方式,您可以以编程方式访问变量,它将保持不变。如果你不能,它将被销毁。

答案 1 :(得分:1)

据我所知var ar:Array = []是函数something()的本地函数,当函数退出时将为GC。除非你在函数返回时选择它,如你在案例1中所建议的那样:var val:Array = something();。调用something();不应累积内存。

编辑:

我发现这个link,同时深入研究这个问题;检查PowerPoint。

如果只运行一次该函数,则该数组实际上将保留在内存中。但是,此后的任何分配都可能会触发垃圾收集器运行,最终应该删除ar。这仍然表明,从长远来看,变量ar不会挂在something()并堵塞你的记忆。