清空 Array = [ ] 会导致内存泄漏吗?

Will emptying an Array = [ ] cause memory leak?

大家好,我想知道是否像这样移除舞台上的所有对象:

//bomb
for each (var bomb:mcBomb in aBombArray)
{
    bomb.parent.removeChild(bomb);
    aBombArray = [];
    bomb = null;
}

在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置回 0 吗?我应该改用 aBombArray.length = 0; 吗?

我在游戏结束时像这样删除了所有阵列。我注意到,当您看到 'Game Over' 屏幕时,内存并没有减少,而是仍在攀升。不确定这是否是问题所在。

谢谢大家。

你的代码有一些问题,但我想你问的是将 Array 属性 设置为 [] 是否足以取消引用所有使用的元素在那个数组中。答案是肯定的,只要没有对该数组或数组中元素的其他引用。例如:

var bombs:Array = [a, b, c];
var bombs2:Array = bombs;
bombs = [];
// a, b, c remain in memory because they are still referenced by bombs2

一个稍微更彻底的清除数组的方法是将它的长度设置为 0。在这种情况下,所有对数组的引用都将被清除,因为你没有重新分配 属性,你直接修改数组:

var bombs:Array = [a, b, c];
var bombs2:Array = bombs;
bombs.length = 0;
// both bombs and bombs2 are cleared, so a, b, c will be removed from memory

当然,对数组中元素的任何引用(包括其他数组中的元素)都会将这些对象保留在内存中。

var bombs:Array = [a, b, c];
var bombs2:Array = [a, b];
bombs.length = 0;
// bombs2 still references a, b so they will remain in memory

回到您的原始代码,假设没有像前面示例中那样对数组中的元素的其他引用,以下应该可以工作:

for each (var bomb:mcBomb in aBombArray) {
    bomb.parent.removeChild(bomb);
}
aBombArray.length = 0;

注意:

  1. 直到循环结束才清除数组。
  2. 不需要每次迭代都设置bomb = null,因为每次迭代都会立即赋新值,而且作为局部变量,在函数作用域returns时会被解引用.

最后,你提到你最后没有看到内存下降。垃圾收集发生在未来某个未知的时间,此时运行时决定是一个好时机,因此您不会在对象完全取消引用后立即释放内存。在调试环境中,您可以使用 System.gc() 来测试内存是否已释放。

我建议您使用 Adob​​e Scout 或分析器来查看内存中实际保留的对象。