奇怪的问题:
使用这个函数:
function something():Array
{
var ar:Array = [];
var i:MovieClip;
for each(i in list)
ar[ar.length] = i.x;
return ar;
}
ar
会被丢弃,还是会继续在我的内存中冷却,从而增加每次调用此函数时使用的内存?
我的问题适用于以下每种情况:
var val:Array = Something();
(显然val
存储在内存中,但是函数中创建的原始数组呢?)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/