AS3のLoaderで読み込んだ外部swfを確実にunloadする方法

公式サイトのFAQやリファレンスには、子swfがストリームを利用している場合のunload方法が紹介されています。

が、私の場合はストリームを利用していなくてもunloadでswfが破棄されず、メモリリークが発生する現象が発生。1週間ほど苦しんだ末にやっと以下の方法で解決できました。

  • unload時に、子swf内のイベントリスナーを全てremoveする
  • unload時に、子swf内のクラス変数の中で、オブジェクトを参照しているもの全てにnullを代入する

この対処をしないと破棄されないswfの正確な条件はまだ良く分かりませんが、とりあえず手元にあるやつだとPapervision3Dを利用しているものにこの対処が必要でした。
Loaderオブジェクトへの参照があるとガベージコレクトされないのは分かるけど、その中のものまで掃除しなきゃいけないってのが謎です。

子swfでのstage参照

もうひとつ注意点。unloadが送出された時には子swfのstageはnullになっています。そのためstageに直接リスナーを追加していると削除できないリスナーが残ってしまいます。なので、stageにリスナーを追加したい場合は、stageに直接ではなく、stageへの参照を用意してそれに追加するようにすればオッケーです。

参考サイト