清空 Array = [ ] 会导致内存泄漏吗?
Will emptying an Array = [ ] cause memory leak?
大家好,我想知道是否像这样移除舞台上的所有对象:
//bomb
for each (var bomb:mcBomb in aBombArray)
{
bomb.parent.removeChild(bomb);
aBombArray = [];
bomb = null;
}
在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置回 0 吗?我应该改用 aBombArray.length = 0;
吗?
我在游戏结束时像这样删除了所有阵列。我注意到,当您看到 'Game Over' 屏幕时,内存并没有减少,而是仍在攀升。不确定这是否是问题所在。
谢谢大家。
你的代码有一些问题,但我想你问的是将 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
,因为每次迭代都会立即赋新值,而且作为局部变量,在函数作用域returns时会被解引用.
最后,你提到你最后没有看到内存下降。垃圾收集发生在未来某个未知的时间,此时运行时决定是一个好时机,因此您不会在对象完全取消引用后立即释放内存。在调试环境中,您可以使用 System.gc()
来测试内存是否已释放。
我建议您使用 Adobe Scout 或分析器来查看内存中实际保留的对象。
大家好,我想知道是否像这样移除舞台上的所有对象:
//bomb
for each (var bomb:mcBomb in aBombArray)
{
bomb.parent.removeChild(bomb);
aBombArray = [];
bomb = null;
}
在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置回 0 吗?我应该改用 aBombArray.length = 0;
吗?
我在游戏结束时像这样删除了所有阵列。我注意到,当您看到 'Game Over' 屏幕时,内存并没有减少,而是仍在攀升。不确定这是否是问题所在。
谢谢大家。
你的代码有一些问题,但我想你问的是将 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
,因为每次迭代都会立即赋新值,而且作为局部变量,在函数作用域returns时会被解引用.
最后,你提到你最后没有看到内存下降。垃圾收集发生在未来某个未知的时间,此时运行时决定是一个好时机,因此您不会在对象完全取消引用后立即释放内存。在调试环境中,您可以使用 System.gc()
来测试内存是否已释放。
我建议您使用 Adobe Scout 或分析器来查看内存中实际保留的对象。