У меня есть функция, которая принимает другую функцию в качестве параметра.Примерно так:
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;
}
, и это устранит утечку памяти , даже если я все еще передаю значение HitCB в качестве параметра .Так что это будет означать, что это не функция «getter» для получения onHitCB, а что-то еще, вызывающее утечку памяти?
Я очень запутался.Как это может вызвать утечку памяти:
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
}
и есть ли способ не делать этот обходной путь?