[AS2]swfを外部読み込みする時の注意

このエントリのスライドで、これとかこれを外部読み込みしてスライドswf上で動かしてるんだけど、途中で違うswfのコンストラクタが呼び出されたり、アンロードしたswfのonEnterFrameが延々実行されてたりと奇妙な現象に遭遇したのでその辺の回避策メモ。

  1. 外部読み込みをすると読み込まれるswf(子swf)で指定してる_rootが読み込み元のswf(以下親swf)の_rootに置き換わってしまう。
            ↓
    子swfの_rootは子swfの_rootとして固定するために、親swf内で読み込み先のmcを指定してmc._lockroot = trueしておく。
  2. unloadしてもそのswf内のイベントが残り、作動し続ける。例えば子swf内のonEnterFrameで何か実行していたらその子swfをunloadしてもonEnterFrameは実行され続ける。
            ↓
    アンロード前に片付けをする関数を子swf内に用意しておく。片付け関数内では、以下の処理をしておくこと。
    ・addListnerしたものはすべてremoveListenerする。
    ・関数を放り込んだイベントハンドラはnullを突っ込んで空にしておく。
    ・attachMovieやcreateEmptyMovieClipで作ったMovieClipはすべてremoveMovieClipしておく。
    ・bitmapDataはすべてdisposeする。
    ・setInterval使ってる場合はclearIntervalする。
    ・変数、配列、オブジェクトにnullを突っ込んで空にする。

    ここでdeleteせずにnull突っ込んでるのは、deleteすると再度読み込み時にdeleteしたプロパティが見つからない状態になっちゃうのでnullで中身を空にするだけにとどめておく。もし再度読み込む必要がなければdeleteでもいいのかも。(なんかどっかでonEnterFrameはnullじゃなくてdeleteした方がいいみたいな文章を見たような気がするけど理由忘れた。)
    この一連の処理を一つの関数にまとめて、onUnloadに片付け関数を放り込めば子swfがアンロードされる直前に片付けが実行されて無駄にCPUに負荷を与えたり、メモリ無駄食いしなくなる。はず。

  3. 実装、挙動の異なる同名のクラスを使った別々のswfを読み込むと、後から読み込んだswfが使うクラスが動作しなくなる。例えば、あるswfをMainクラスからスタートするように作っていたら、他のMainクラスからスタートするswfを読み込んでも動作しなくなる。というか先に読み込んだswfのMainクラスが動作する。
            ↓
    これどうなってんのか全然わからなかったんだけど、デバッガ回してみたら_globalに変数としてクラスが読み込まれてた。んで子swf内で使ってるクラスも全部_globalに読み込まれる。だから同名のクラスがあると衝突するみたい。同名クラスが上書きされないのはよくわからんけど。

これらを考えると、HTMLのフレーム使って個々のswf切り替えてるyugop.comの構造は頭良過ぎる。