我有一個函數將另一個函數作爲參數。事情是這樣的:AS3傳遞函數作爲參數創建內存泄漏
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,則不會發生內存泄漏。
所以很明顯,當我通過HITCB作爲一個參數是問題。所以我認爲這可能是因爲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
}
有沒有辦法不必做這個解決方法?
爲什麼不讓onHitCB成爲CollisionManager的類成員?聽起來像你的功能是放寬範圍。在onHits的最後一行嘗試callback = null; –
嘗試在onHits結束時將回調設置爲null,但泄漏仍然存在。到目前爲止,保留對函數的本地引用是我能找到的唯一解決方法。 – Godfather