1

Flex には、モジュール クラスのインスタンスである子の「セクション」をロードして破棄する「フレームワーク」があります。これらには多くの Web サービスとアニメーションが含まれており、公開サイトの一部です。

画面からセクションを削除する前に、インスタンスで「hideSection()」インターフェイス メソッドを呼び出します。このメソッドでは、コントロールをフェードアウトするか、セクションが閉じられないようにする場合は false を返します。現在、実行中の Timer インスタンスも停止します。

問題は、セクション オブジェクトがステージから削除されても、未解決の処理が残っている可能性があることです。たとえば、effectEnded が何かをトリガーする場所でエフェクトを実行している場合や、低速の Web サービス リクエストがタイムアウトしてエラーがポップアップする場合があります。

ガベージ コレクターの動作方法により、そのオブジェクト object がすぐに殺されることもあれば、後で殺されることもあります。セクションが閉じられると、悪いことが起こるのを最小限に抑えようとしています。

次の可能な解決策を思いつきました。より良いものがあるかどうか疑問に思いました。

  • true に設定された _disposed プロパティがあります。(セクションが閉じられた後)望ましくない動作をする可能性のあるイベントハンドラー内では、if (_disposed) { return; }.
  • .NET のように、'IDisposable' インターフェイスを実装する必要がある場合もあります。

これが本当に私の唯一の選択肢ですか?それとも、ガベージ コレクションを早めることができますか? エフェクトがまだ実行されている場合でも、ガベージ コレクションが発生する可能性はありますか?

また、特にタイマーを _null に設定する必要があるかどうかについても興味があります。または、参照が残っていない場合、タイマーを停止してガベージコレクションするだけで十分ですか。

4

2 に答える 2

1

http://gskinner.com/talks/resource-management/

これはガベージ コレクションに関するグランド スキナーの話です。スライド 32 あたりで、彼は用務員制度について語っています。あなたはそれを読んで、彼のソースファイルを手に入れることができます.

また、フラッシュ 9 のガベージ コレクションに関する彼の講演をよく理解していることを確認して ください。

特にこの部分を見てください:

回避策と戦略 これらの問題に対処するために今できることは主に 4 つあります。

  1. 大規模なアプリケーションにロードする可能性のあるコンテンツでは、timer および enterframe イベント リスナーを常に削除していることを確認してください。また、可能な限りステージ リスナーを使用しないようにし、使い終わったらすぐに削除してください。

  2. SWF で標準 API を公開して、他の SWF がクリーンアップして実行を停止するように指示できるようにします。このようにして、読み込み中のアプリケーションは、コンテンツをアンロードする前に (try/catch ブロック内で) このメソッドを呼び出すことができます。sharedEvents を介した「停止」イベントのリスナーに支えられた .halt() メソッドをお勧めします。

  3. サブドメインからコンテンツ SWF をロードできます。これにより、暗黙的にセキュリティ サンドボックスに配置されます。

  4. メイン アプリケーションの上にレイヤー化された div にコンテンツを読み込みます。これは優れたオプションではありませんが、ほとんどすべての問題に対処できます。

于 2008-10-24T17:51:19.830 に答える
0

hideSection() メソッドですべてのアクティブなイベント リスナーを削除できます。

removeEventListener(this, listenerFunction, eventType);

弱参照を使用してイベント リスナーを追加し、他に参照がない場合は、リスナーのターゲットをガベージ コレクションする必要があります。

于 2008-10-19T14:25:06.267 に答える