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

时间:2015-02-13 02:13:36

标签: arrays actionscript-3 memory-leaks array-splice

嘿伙计们,我想知道是否删除舞台上的所有物品:

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

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

我在游戏结束时将所有数组都删除了。我注意到,当你进入“游戏结束”屏幕时,内存不会减少而是仍然会爬升。不确定这可能是问题所在。

谢谢你们。

1 个答案:

答案 0 :(得分:8)

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

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

    我建议您使用Adobe Scout或分析器来查看内存中实际存在的对象。