0

给我一个谜语:我有我的MouseEvent.MOUSE_DOWN哪个电话mouseHandler。后者看起来像这样:

public function mouseHandler(evt:MouseEvent):void
{

    var p:Point = new Point(mouseX, mouseY);

    var objs:Array = new Array(getObjectsUnderPoint(p));

}

现在我想知道的是:是否每次都会覆盖 objs 数组和 p 点,只是导致先前的 objs 数组和 p 点被擦除并生成一个新的,或者......它是否只是创建一个新数组并一遍又一遍地指出?当然,如果我 trace(objs) 它给了我预期的结果,但是我是否在没有意识到的情况下在后台阻塞了系统?您的专业知识将不胜感激。

编辑:在从回答者那里学到了很多东西之后-谢谢顺便说一句-这让我想到了别的东西,然后快速搜索,找到了一种理论上可靠地删除参考的方法:

var a = null;

现在我明白这可能不是必需的,因为它们将在函数结束时被 GC,但考虑到编写需要两个滴答声,比抱歉更安全,不是吗?

4

2 回答 2

0

由于 p 是一个对象,而不是原语,它的内存分配将来自堆(因此需要被垃圾收集)而不是像本地原语那样的堆栈(并且在函数结束后被擦除。

所以每次调用这个函数时都会分配新的内存,这将暂时增加内存使用量,直到它们被 GC'd,但数量可能微不足道(假设数组不是很大!)。

于 2012-06-01T11:10:46.430 回答
0

据我了解,它的工作原理是这样的 - 这些变量的引用将在函数结束后丢失。这些值最终将被 GC'ed。

如果第二次调用该函数,会创建新的引用,并填充新的数据,但之前引用的值可能仍然存在于内存中,等待垃圾收集器,但这不一定会发生!如果它们附加了侦听器,Flash Player 将认为它们仍然有用,因此它们将存在于内存中,直到应用程序运行和侦听结束,甚至对事件做出反应——即使理论上您无法再访问它们。

编辑:在您的情况下,您正在创建两个将在函数结束时消失的引用。它们与事件侦听器无关,侦听器创建它们,但不附加到它们,因此它不会阻止 GC 在函数结束后收集它们。您创建了一个引用数组,但这只是对在其他地方引用值的其他对象的引用(如显示列表),如果在此函数之外的任何地方都没有单独引用该数组,则它应该被 GCted。

于 2012-06-01T11:57:11.760 回答