Ho una funzione che accetta un'altra funzione come parametro. Qualcosa di simile a questo:AS3 che passa una funzione come parametro crea perdite di memoria
public function onHits(target : Shape, callback : Function) : void
lo uso passando una funzione di membro come un parametro che deve essere chiamato ogni volta che il bersaglio passato colpisce qualcosa. La funzione è chiamata più volte un frame. Così è usato da fare:
//code...
CollisionManager.onHits(myShape, onHitCB);
//code...
La sulla funzione colpo:
public function onHitCB(hitObject : *) : void
{
//removed all code to test this problem
}
Quando faccio questo, ho una perdita di memoria. Ho isolato il problema con quel metodo onHits e ho commentato tutto il resto. onHits è un metodo vuoto senza codice al suo interno, onHitCB è anche vuoto. Se commento la chiamata a onHits, non c'è perdita di memoria e se passo null anziché onHitCB non c'è perdita di memoria.
Quindi è chiaro quando passo HitCB come parametro è il problema. Quindi ho pensato che potrebbe essere perché Flash assegna un po 'di memoria per creare il puntatore Function e non lo rilascia, ma chiamo System.gc() ogni frame in modalità debug e la perdita è ancora lì. Il che significherebbe che questo è un bug nell'SDK o che non sto facendo qualcosa di giusto.
Ho trovato una soluzione strano mantenendo una variabile che indica la funzione che assegno nel costruttore mio oggetto:
private var func : Function;
public function MyObject()
{
func = onHitCB;
}
e questo sarà cancellare la memoria perdita anche se ancora passare onHitCB come parametro. Ciò significherebbe che non è la funzione "getter" per ottenere onHitCB ma qualcos'altro che causa la perdita di memoria?
Sono molto confuso. Come può causare una perdita di memoria:
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
}
ma non questo? :
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
}
e c'è un modo per non avere a che fare questa soluzione?
Perché non fare onHitCB un membro della classe di CollisionManager? Sembra che la tua funzione stia perdendo portata. Sull'ultima riga di onHits prova callback = null; –
Provato a impostare il callback su null alla fine di onHits ma la perdita è ancora presente. Finora, mantenere un riferimento locale alla funzione è l'unica soluzione alternativa che sono riuscito a trovare. – Godfather