1

嘿伙计们,我想知道是否像这样删除舞台上的所有对象:

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

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

我在游戏结束时像这样删除了所有数组。我注意到,当您进入“游戏结束”屏幕时,内存并没有减少,而是仍在攀升。不确定这是否是问题所在。

多谢你们。

4

1 回答 1

9

您的代码存在一些问题,但我认为您要问的是设置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在每次迭代中设置,因为每次迭代都会立即分配一个新值,并且作为局部变量,当函数范围返回时,它将被取消引用。

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

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

于 2015-02-13T03:18:22.073 回答