好奇的问题:
采取此功能:
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();
答案 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()
并堵塞你的记忆。