2017-07-16 6 views
0

私はボタンの配列を持っており、このようなイベントリスナーを付けました。Actionscript:このイベントリスナーが大量のメモリ消費を引き起こすのはなぜですか?

arr[c].addEventListener(MouseEvent.MOUSE_UP, Proxy.go(this, click, Model.categoriesListXml.category_0[i].category_1[j][email protected]_id, Model.categoriesListXml.category_0[i].category_1[j][email protected])); 

150個は32MBのメモリを使用しました。

次のメモリを使用した場合、2MBに低下しました。

var categoryId:String = Model.categoriesListXml.category_0[i].category_1[j][email protected]_id; 
var name:String = Model.categoriesListXml.category_0[i].category_1[j][email protected]; 
arr[c].addEventListener(MouseEvent.MOUSE_UP, Proxy.go(this, click, categoryId, name)); 

私はすべて、イベントリスナーで使用する前にxml要素を独自のvarsに配置しました。

これはなぜ起こっているのですか?

私の推測では、必要な要素だけでなく、XMLオブジェクト全体が含まれていると思います。

答えて

4

次のように動作すると思います。

お試しください。何かを処理する場合、Flashは非常に怠惰です。-関連しています。実際には、たとえ意識的にすべての参照を削除しても、System.disposeXML(...)メソッドがあるので、XMLオブジェクトはガベージコレクションされない可能性があります。

キャッチ。ほとんどのXML操作は、XMLまたはたXMLList対象になりますが、2 のXMLListオブジェクトを渡す明示的Stringにあなたの属性をキャストすることなく、だから、

// XML source. 
var X:XML = <root a="1" />; 

// You might think it returns String, but no, it is just autocast to String. 
var a:String = [email protected]; 

// If you don't specify data type, this returns XMLList object of length 1, 
// with an XML member of type "attribute", name "a" (or maybe "@a"), and so on. 
var A:* = [email protected]; 

を言うことを、理解することが重要ですその代わりに関数の引数として(またはそう思われる)。

最後に、Proxy.go(...)は、(タイプはclosure)であり、格納されている引数リストを持つ名前のないバインドされていない関数を作成することを示しています。それは次のようになります。ローカル変数やメソッドの引数:

public function go(target:Object, method:Function, ...rest:Array):Function 
{ 
    return function():void 
    { 
     method.apply(target, rest); 
    } 
} 

これは、閉鎖は、すべての親メソッドのデータにアクセスすることができますECMA標準(おそらくJavaScriptなどもで動作します)に動作します。

だから、あなたはそれを持っています。名前のない関数の中には、プレイヤーのメモリのどこかに(ほとんどの永遠に)、0以外の引数のリストがあります。これらのオブジェクトには、永続的で扱いにくいオブジェクトが含まれます(XMLList)。そうすれば、このような怪物を150個作成することができます。噴水やナイアガラで記憶が漏れるのは当然のことです。

+0

@Organic、包括的な説明をいただきありがとうございます。だから、リスナーで.toStringを試してみましたが、これもメモリの問題を修正しました。 – Mar

関連する問題