arrays - AS3 中函数内定义的数组是否会在函数末尾被丢弃?

标签 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();

总是这样做可能会更安全吗?:

return ar.slice();

最佳答案

垃圾收集由闪存引擎自动完成。然而,这并不是立即完成的。在 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;

或者

stupidArr.pop(); //Looped as desired

只要函数“something()”中的数组没有被引用(每次弹出都会清除,或者完全为空)。通过您可以访问的变量。该元素将免费用于 GC。因而会留下内存。

因此,“Array.slice()”对于您的函数来说实际上是一个坏主意,因为它使 GC 之前的内存消耗增加了一倍(影响性能)

另一方面,如果假设您的函数有无用的变量,例如:您的循环计数器。如果它们在一天结束时没有被引用,它们也会被 GC 处理。对于闪存来说,变量和垃圾收集“非常容易”。只要知道这个经验法则即可。

If by any means possible, you can programically access the variable, it will persist. If you cant, it will be destroyed.

关于arrays - AS3 中函数内定义的数组是否会在函数末尾被丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592947/

相关文章:

php将数组行重新排列成列以显示在表中

javascript - 可以从 JavaScript 网络 worker 调用 ActionScript 函数吗?

java - 如何让FlashDevelop使用32位JRE?

apache-flex - 人们应该如何查看使用相同底层 ArrayCollection 的不同数据网格中的不同过滤数据?

actionscript-3 - 子影片剪辑上的 as3 gotoandplay 帧

C++简单文件读入数组问题

arrays - Bash:计算关联数组中键的总数?

将指针数组值复制到 C 中另一个数组的末尾

flash - 没有adobe cirrus的点对点连接

apache-flex - 有没有办法将另一个类的成员函数作为参数传递给as3中的函数?