作者:mobiledu2502911857 | 来源:互联网 | 2023-05-22 10:57
嘿伙计们,我想知道是否删除舞台上的所有对象:
//bomb
for each (var bomb:mcBomb in aBombArray)
{
bomb.parent.removeChild(bomb);
aBombArray = [];
bomb = null;
}
在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置为0吗?我应该改用aBombArray.length = 0;
吗?
我在比赛结束时将所有阵列都移除了.我注意到,当你进入"游戏结束"屏幕时,内存不会减少而是仍然会爬升.不确定这可能是问题所在.
多谢你们.
1> Aaron Beall..:
您的代码存在一些问题,但我认为您要问的是,设置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或分析器来查看内存中实际存在的对象.