複数のモジュールを使用する巨大なフレックス アプリケーションがあります。モジュールのロードとアンロードを長時間使用すると、大きなメモリ リークの問題が発生します。
すべての検索とさまざまな記事に基づいて、アンロード時にオブジェクトをクリーンアップし、イベント リスナーを削除し、タイマーを停止し、参照を破棄する必要があることを理解しています。
これは、モジュールの 1 つで一度に 1 つのコンポーネントをピックアップすることから始めました。
これがどのように構成されているかです。
複数のビューを持つモジュールをロードする 1 つの親アプリケーションがあります。コンポーネントは mxml で定義され、ビュー スタックの mxml モジュールで参照されます。
この mxml コンポーネントは、イベント リスナーが追加された VBox です。
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"
paddingTop="10"
paddingLeft="10"
paddingBottom="10"
paddingRight="10"
creationComplete="onInit()"
show="onShow()"
resize="onResize(event)" ....
mxml には、親コンテナーからバインドされたプロパティがいくつかあります。上記のリスナー以外にも、外部からアクセスされるプライベート変数があります -
[Bindable]
private var _model:SModelLocator=SModelLocator.GetInstance();
モジュールのアンロード時に、このコンポーネントで次のように破棄関数を呼び出します-
public function dispose():void
{
this.removeEventListener(FlexEvent.CREATION_COMPLETE,onInit);
this.removeEventListener(FlexEvent.SHOW,onShow);
this.removeEventListener(ResizeEvent.RESIZE,onResize);
var arr:Array = this.getChildren();
for(var i:int = 0; i<arr.length;i++)
delete arr[i];
this.removeAllChildren();
_model = null;
//Properties that are binded from the parent container
Property1 = null;
Property2 = null;
this.deleteReferenceOnParentDocument(this.parentDocument as IFlexDisplayObject);
}
プロファイラーを実行してモジュールを切り替えると、このコンポーネントのインスタンスの数は増え続けています。プロファイラーで GC Collect をクリックしましたが、インスタンスはそのままです。
モジュールmxmlである親コンテナで、モジュールのアンロード時に次の行も書いてみました-
//function call to invoke dispose as above
component1.dispose();
component1 = null;
助けてください。ここで何が欠けているのか、あるいはこれが正しいアプローチなのかさえわかりません。
ありがとう。