您的代码存在一些问题,但我认为您要问的是,将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 或分析器来查看内存中实际存在哪些对象。