"new"キーワードを使用してオブジェクトを作成するたびに、あなたはクレームをメモリ[1]にかけています。だから、あなたはvar exampleUint:uint = new uint();
と書くことで、あなたが作っているとしましょう。 ActionScriptはコンピュータに "ちょっと...私は4バイトのメモリが必要です"というメッセージが表示されますが、コンピュータは "ok cool、0x7B3208C1のようなメモリアドレスから始まる4バイトを使用します" [2] 。だから、var someString:String = "blah";
と言うときは、メモリ内のスペースを要求し、いくつかの情報(この場合は"blah"
)を入力し、ラベル(この場合はsomeString
)を作成し、メモリ内のそのスペースのラベルにbindを付けます。
ラベルはデータ自体に実際には関連付けられていません。データを含むメモリ内のスポットに関連付けられます。それは混乱しているように見えるはずですが、それはある理由のために全体的な意味合いがあります。 ActionScriptのすべてのオブジェクトはreferenceの型です。つまり、オブジェクトにはデータそのものではなく、データの一部のメモリアドレスが含まれています。これは、ラベルがデータ自体に関連付けられるvalueタイプのオブジェクトとは対照的です。値の型の詳細については、ActionScriptにはないので気にしないでください。あなたの目的のために、私はそれを厳密にコントラストに含めています。 OK、混乱していますか?あなたはおそらく、この段落全体が不必要に特定であり、おそらくは不必要であるため、かもしれないので、はあなたの問題と関係があるので、頭の後ろにそれを保持しようとするので、
このラベルが消えた場合(scopeから外れるなど)、someString
というラベルのみが削除されます。したがって、この例ではsomeString = null;
と言うと、文字列"blah"
は実際にはまだメモリに残っていますが、ラベルsomeString
はその情報を参照していないため、the null objectというメモリアドレスを参照しています。私は、コンピュータに "あなたが[whateverAddress]で始まると主張しているメモリを知っていますか?それで、他の誰かがそのメモリを使うことができるようになりました"。Gabage collectionは、自分で心配することなく、あなたが主張したメモリを再利用する自動プロセスです。ガベージコレクションのない言語では、new
には、オブジェクト[3]に関連付けられたメモリを特に解放する補完キーワードがありますが、ActionScriptにはそれがありません。あなたはただの思い出を忘れてしまいます。
他の変数を作成し、そのデータを参照している可能性があります。var someOtherString:String = someString;
だから、「ok」と言うだけではありません。someString
というラベルがなくなったので、参照するデータなぜなら、someString
がそのデータへの唯一の参照であることがわからないからです。これが行われるメソッドは、言語とガベージコレクションシステムによって異なりますが、ActionScriptの基本的な取り決めは次のとおりです:今やFlashが現在多くのメモリを占有している場合は特に、ガベージコレクタは現在のSWF内のオブジェクトを検索し、参照を持たないすべてのオブジェクトを見つけます[4]。したがって、前の例では、文字列"blah"
およびsomeString
を参照する唯一のものがsomeString
だった場合、"blah"
はラベルに関連付けられていないため、Flashによって完全に到達できません。ガベージコレクタが次に実行されるときに、それを見つけて、そのメモリで完了したことをシステムに報告します。
ここで、特定の問題の具体的な詳細は、ソースを見なければ言い難いですが、問題の原因の1つにイベントリスナーがあることがわかります。場合によっては、関数を作成してイベントリスナーとして追加することがあります。今度はイベント自体はその関数[5]への参照を持っているので、関数がスコープから外れてもまだ参照があり、関数はガベージコレクタによって取得されません(関数はActionScript)。あなたはremoveEventListenerを呼び出すことによって手動でイベントハンドラを削除することができます(私はそれをお勧めしません)。またはaddEventListener()をtrue
に呼び出してuseWeakReference
パラメータを設定します。弱参照はガベージコレクタによって認識されないため、useWeakReference
をtrue
に設定すると、がになるはずの状況がガベージコレクタによって検出されることはありませんが、誰かがイベントリスナーとして参照しているため。プロジェクト内のマウスイベントリスナーの数によって判断すると、これが原因かもしれません。 Flex Builderを使用している場合は、プロファイラを使用してメソッドのクロージャ数を確認できます。もし彼らが上ってきて、決して降りないなら、それはおそらくあなたの問題です。
[1]:これはvar exampleInt:int = 5;
と書く場合のように、new
キーワードを使用せずにオブジェクトを作成する場合にも当てはまります。
[2]:すべての単位が同じサイズであるため、私はuintを選択しました。それで4バイトとなることを自信を持って言い表すことができます。文字列は異なります。それらは含まれている文字の数に比例した量のメモリを占有するので、両方の例にStringを使用するのはもう少しあいまいです。
[3]:ActionScriptキーワードdelete
はこの目的のためのものではありません。このように使用しないでください。論理的には理にかなっており、非常に便利です。
[4]:Flashはmark-and-sweepスタイルの戦略を使用しますが、より具体的な詳細はhereとなります。 [5]:実際は、addEventListenerメソッドがclosuresを使用しているため太字になっていますが、私はそれを理解するのにはかなり弱いので、普通の人の英語にはできません。
AS3では、イベントリスナーへの弱い参照を作成して、イメージなどをガベージコレクションできるようにすることができます。 –
これはaddEventListenerであり、逆の方法です。イベントをリッスンする関数は、イメージが存在する限り収集されません。 –
あなたは本当に正しいです。私の間違いを指摘してくれてありがとう。 –