您的代码存在一些问题,但我认为您要问的是设置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;
注意:
- 直到循环结束,数组才会被清除。
- 不需要
bomb = null
在每次迭代中设置,因为每次迭代都会立即分配一个新值,并且作为局部变量,当函数范围返回时,它将被取消引用。
最后,您提到最后没有看到内存下降。垃圾收集发生在未来某个未知时间,此时运行时决定是一个好时机,因此您不会看到在对象完全取消引用后立即释放内存。在调试环境中,您可以使用它System.gc()
来测试内存是否被释放。
我建议您使用 Adobe Scout 或分析器来查看内存中实际存在哪些对象。