Macromedia Flash非公式テクニカルノート Flash Player 10で予め配置したMovieClipのないフレームに移動したときイベントリスナーがすぐに消える
問題 たとえば、メインタイムラインに2フレームをつくり、その第1フレームのみに空のMovieClipインスタンスを置きます(図001)。MovieClipシンボル内にスクリプトは書きませんし、とくにビジュアルエレメントもなくて構いません。インスタンス名はmy_mcとします。 図001■全2フレームのメインタイムライン第1フレームにMovieClipインスタンスを置くMovieClipインスタンスを置いたメインタイムラインの第1フレームに、以下のスクリプト001を書きます(図002)。フレームアクションは、MovieClipインスタンスmy_mcのDisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)にリスナー関数(xTest())を登録しています。 そして、リスナー関数は、メインタイムラインの現行フレームと子インスタンスの数、およびインスタンスに設定した変数(id)の値を[出力]します。この変数値はgetTimer()関数が返す整数で、インスタンスを識別するために設定しています(前掲「予め配置したMovieClipのリスナーがインスタンスのないフレームに移動してもイベントを受取る」参照)。 スクリプト001■メインタイムラインからMovieClipインスタンスにイベントリスナーを登録
図002■メインタイムラインに第1フレームアクションを記述 [ムービープレビュー]を確かめると、[出力]パネルには何も表示されません。つまり、イベントリスナーが呼ばれていないようです。もちろん、DisplayObject.enterFrameイベントが発生する第2フレームには、MovieClipインスタンスがありません。インスタンスがなくなれば、イベントリスナーもともに消えることになります。 ただし、前述のとおりイベントリスナーを消すのは、ガベージコレクションの役目です。参照がなくなったからといって、ガベージコレクションは直ちに働く訳ではありません。詳しくは、前述「予め配置したMovieClipのリスナーがインスタンスのないフレームに移動してもイベントを受取る」で解説しました。 原因 図003■[パブリッシュ設定]でFlash Player 9に変えると[出力]が表れる [出力]からは、子インスタンスの数が第1フレームは1で第2フレームが0であるにも拘らず、イベントリスナーの数が増えていく理由は、前掲「予め配置したMovieClipのリスナーがインスタンスのないフレームに移動してもイベントを受取る」で説明しています。 対処法 [1] MovieClipシンボルのフレームに何か書く [2] MovieClipインスタンスへの参照をなくす
この結果から、Flash Player 10で加えられたのは、MovieClipインスタンスへの参照を暗黙的に破棄する処理ではないかと推測されます。 作成者: 野中文雄 Copyright © 2001-2010 Fumio Nonaka. All rights reserved. |
|||||||||