だから、私はas3で本当に巨大なプロジェクトを作っています.ガベージコレクタを無効にする方法を知りたいのですが.それが今必要とされているはずです。
すべてのリスナーに移動し、リスナーに名前を付けた後に「false、0、true」拡張子を追加するよりも、ガベージコレクターを無効にする簡単な方法はありますか?
だから、私はas3で本当に巨大なプロジェクトを作っています.ガベージコレクタを無効にする方法を知りたいのですが.それが今必要とされているはずです。
すべてのリスナーに移動し、リスナーに名前を付けた後に「false、0、true」拡張子を追加するよりも、ガベージコレクターを無効にする簡単な方法はありますか?
いいえ、それは不可能ですが、恐れていることは問題ではありません。
また、イベント リスナーを弱体化しても、ガベージ コレクターが無効になることはありません。実際、設定されているオブジェクトがガベージ コレクションの対象になるのは、それが唯一の参照である場合です。
それは実際には可能ですが、それには規律が必要です...
as3 オブジェクトが他のオブジェクトへのすべての参照を失うと、ガベージ コレクションの対象になります。これを回避するには、次の方法を使用できます。
オブジェクトをメモリに保持する必要がある場合は、アクセス可能な場所にバインドします。
ここでサンプルコードを提供しました。
まず、以下のクラスを作成します。
package your.package.path;
public class noGc {
protected static var vault:Array = [];
// In case we forget that noGc should stay static....
public function noGc(){throw new Exception('Error: Instance from STATIC noGc');}
public static function hold(o: *): void {
if(vault.indexOf(o)==-1)vault.push(o); // no multiple references in vault
}
public static function release(o: *): Boolean {
var i: int = vault.indexOf(o);
if(i == -1)return(false); // return value is for information only
vault.splice(i,1); // remove object from vault
return(true);
}
public static function releaseAll(): void {
vault.length = 0;
}
} // end class noGc
「yourObject」で gc を回避するには
noGc.hold(yourObject);
「yourObject」バックで gc を許可するには
noGc.release(yourObject);
通常のコード フローでは、オブジェクトの作成直後にオブジェクトの保持を開始します。その後、使用が終了したら解放する必要があります。
また、例外は通常のフローを壊すため、例外に注意する必要があります。例外を処理し、例外後に無関係になるオブジェクトを解放する必要があります。
保持されているオブジェクトを忘れることは、不要なメモリの使用、別名メモリ リークを意味します。
前に言ったように、それには規律が必要です。
最後に、使用されているすべてのオブジェクトをワイプする必要がある場合は、
noGc.releaseAll();
お役に立てれば。