【问题标题】:Will emptying an Array = [ ] cause memory leak?清空 Array = [ ] 会导致内存泄漏吗?
【发布时间】:2015-04-14 00:19:37
【问题描述】:

大家好,我想知道是否像这样移除舞台上的所有对象:

//bomb
for each (var bomb:mcBomb in aBombArray)
{
    bomb.parent.removeChild(bomb);
    aBombArray = [];
    bomb = null;
}

在游戏结束时导致内存泄漏?这是删除数组中的所有对象并将其设置回 0 吗?我应该改用aBombArray.length = 0;吗?

我在游戏结束时像这样删除了所有数组。我注意到,当您看到“游戏结束”屏幕时,内存并没有减少,而是仍在攀升。不确定这是否是问题所在。

谢谢大家。

【问题讨论】:

    标签: arrays actionscript-3 memory-leaks array-splice


    【解决方案1】:

    您的代码存在一些问题,但我认为您要问的是,将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;
    

    注意:

    1. 在循环结束之前不会清除数组。
    2. 无需在每次迭代中设置bomb = null,因为每次迭代都会立即分配一个新值,并且作为局部变量,当函数范围返回时,它将被取消引用。

    最后,你提到你没有看到内存在最后下降。垃圾收集发生在未来某个未知时间,此时运行时决定是一个好时机,因此一旦对象完全取消引用,您就不会看到内存释放。在调试环境中可以使用System.gc() 来测试内存是否被释放。

    我建议您使用 Adob​​e Scout 或分析器来查看内存中实际存在哪些对象。

    【讨论】:

    • 再次感谢 Aaron 提供的详细信息。我将 Null 添加到我所有的 for 循环中。有趣的是我不知道你可以添加 aBombArray.length = 0;在循环之外。因此,即使该函数在 ENTER_FRAME 事件中,添加它也是安全的?它不会访问 aBombArray.length = 0;首先然后通过for循环?
    • 不确定我是否理解问题...在我的示例中,我在循环之后设置了array.length = 0,否则会影响循环:如果在循环之前清除数组,则循环不会任何要迭代的东西;如果你清除循环内的数组,它将在循环的第一次迭代期间清除它,并且永远不会迭代数组中的任何其他元素。
    • 是的,那是我的问题。你回答了。非常感谢!
    猜你喜欢
    • 2021-03-23
    • 2021-09-25
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 2011-06-16
    • 2011-10-28
    相关资源
    最近更新 更多