gpt4 book ai didi

flash - AS3 将函数作为参数传递会造成内存泄漏

转载 作者:行者123 更新时间:2023-12-04 08:28:56 25 4
gpt4 key购买 nike

我有一个将另一个函数作为参数的函数。像这样的事情:

public function onHits(target : Shape, callback : Function) : void

我通过传递一个成员函数作为参数来使用它,只要传递的目标碰到某个东西就应该调用它。该函数在一帧中被调用多次。所以它是通过做来使用的:
//code...
CollisionManager.onHits(myShape, onHitCB);
//code...

命中功能:
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
}

有没有办法不必执行此解决方法?

最佳答案

[...] bound methods are automatically created when you pass a method as a parameter. Bound methods ensure that the this keyword always references the object or class in which a method is defined. Source



这听起来像是创建对方法的引用并没有使用简单的 getter。生成了一个新的方法闭包对象。所以你的假设是对的。

我想知道为什么不为每个实例缓存引用以及为什么它们没有被垃圾收集。最好避免创建多个引用。当我不得不在多个地方使用该方法时,只引用一次方法正是我会做的,所以大多数时候我不会称它为一种解决方法,而是一种很好的 DRY 实践。在您的示例中,假设方法引用将使用简单的 getter,这当然是有道理的。

关于flash - AS3 将函数作为参数传递会造成内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7317340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com