我有一个函数,它将另一个函数作为参数。大致如下:
public function onHits(target : Shape, callback : Function) : void
我通过将一个成员函数作为参数传递来使用它,这个函数应该在传递的目标物体碰撞时被调用。这个函数每帧会被多次调用。因此,使用方法如下:
//code...
CollisionManager.onHits(myShape, onHitCB);
//code...
触发函数:
On hit 函数:
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
当我这样做时,我会出现内存泄漏。我已经将问题隔离到onHits方法,并注释掉其他所有内容。onHits是一个没有任何代码的空方法,onHitCB也是空的。如果我注释掉对onHits的调用,就不会有内存泄漏,如果我传递null而不是onHitCB,则也不会有内存泄漏。
所以很明显当我将onHitCB作为参数传递时出现了问题。所以我认为可能是因为Flash分配了一些内存来创建函数指针,但我在调试模式下每帧都调用System.gc(),泄漏仍然存在。这意味着这要么是SDK的错误,要么我没有做正确的事情。
我通过保留指向函数的变量并在我的对象构造函数中分配它找到了一个奇怪的解决方法:
private var func : Function;
public function MyObject()
{
func = onHitCB;
}
即使我仍将onHitCB作为参数传递,这将清除内存泄漏。 这意味着获取onHitCB的不是“getter”函数,而是其他原因导致了内存泄漏?
我很困惑。这怎么可能导致内存泄漏:
public function MyObject()
{
}
public function update() : void
{
CollisionManager.onHits(myShape, onHitCB);//empty function
}
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
但不包括这个吗? :
private var func : Function;
public function MyObject()
{
func = onHitCB;
}
public function update() : void
{
CollisionManager.onHits(myShape, onHitCB);//empty function
}
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
有没有不需要这样解决的方法?