嘿伙计们,我想知道是否删除舞台上的所有物品:
//bomb
for each (var bomb:mcBomb in aBombArray)
{
bomb.parent.removeChild(bomb);
aBombArray = [];
bomb = null;
}
在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置回0吗?我应该使用aBombArray.length = 0;
吗?
我在游戏结束时将所有数组都删除了。我注意到,当你进入“游戏结束”屏幕时,内存不会减少而是仍然会爬升。不确定这可能是问题所在。
谢谢你们。
答案 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;
请注意:
bomb = null
,因为每次迭代都会立即分配一个新值,并且当函数作用域返回时,它将作为局部变量被取消引用。 / LI>
醇>
最后,你提到你最后没有看到记忆力下降。垃圾收集在未来的某个未知时间发生,当运行时决定是一个好时机时,所以一旦对象被完全取消引用,你就不会看到释放的内存。在调试环境中,您可以使用System.gc()
来测试是否释放了内存。
我建议您使用Adobe Scout或分析器来查看内存中实际存在的对象。