web-dev-qa-db-ja.com

Actionscript 3でオブジェクトを削除/ GCするにはどうすればよいですか?

クラスインスタンスのガベージコレクションをそれ自体から削除/強制したい。明らかに、this = nullおよびdelete this機能しません。それは私がそれを行うことができる方法ですか、それとも間違った木を吠えていますか?基本的には、何らかのデストラクタを探しています。

XMLファイルをロードしようとするクラスインスタンスがあり、ファイルが見つからない場合は、インスタンスを、できればそれ自体から破棄したいと考えています。次に、子インスタンスがnullかどうかに応じて、親クラスでいくつかのことを行うことがポイントです。

私は親にイベントを投げてそこから子を削除することを考えましたが、私は他に方法がない場合にのみそうしたいと思います。

20
evilpenguin

オブジェクト自体からオブジェクトを削除しようとしないでください。これは悪い習慣であり、AS3では確実に実行できません。

オブジェクトmayオブジェクトへの参照が残っていない場合にのみ削除(つまり、ガベージコレクション)されます。参照は常に値で渡され、オブジェクトは通常、その参照が存在することを認識していないため、オブジェクトをそれ自体から削除することはできません。あなたができる唯一の便利なことは、インスタンスによって使用されるすべてのリソースをクリーンアップするメソッドを作成することです。このようなメソッドはデストラクタとして機能しますが、手動で呼び出す必要があります。イベントリスナーは、削除しない限り、ガベージコレクションも防止することを忘れないでください。

プロパティをdeleteすることとnullに設定することにも違いがあります。事実上、deleteは動的クラスのインスタンスからプロパティを削除します。一方、プロパティ値をnullに設定してもプロパティは削除されませんが、そこに格納されていた参照はすべて消去されます。したがって、両方のアクションは、いくつかのプロパティに格納された参照を破棄します。 deleteはオブジェクトではなく、プロパティのみであることに注意してください。

Flash Player 9以前では、ガベージコレクションを開始するために使用できる特定のハックがあります。しかし、最近、同じことを行うSystem.gc()呼び出しが利用可能になりました。 GCが実際に呼び出されるという事実に実際に依存することはできないことに注意してください。これはフラッシュプレイヤー次第です。

質問に戻る:イベントをスローし、何かがうまくいかなかったことを親に通知することは、実際には良い考えです。あなたはそれに固執するべきです。さらに、親がそのようなイベントをそのように知っていて、いくつかのプロパティが魔法のように無効にされたことを発見したときではない方がよいでしょう。

PS:Flash PlayerでGrant Skinner articles on memory を読むのは良い考えです。

22
dragonfly

AddChild()メソッドを使用してオブジェクトがDisplayContainerに追加された場合、parent.removeChild(this)を使用して、オブジェクト内からコンテナーからオブジェクトを削除できます。その後に残っているオブジェクトへの参照がない場合は、ガベージコレクターによって取得されます。

唯一の問題は、オブジェクト内にイベントリスナーがある場合です。これは、手動で削除するか、すべてのリスナーでweakReference = trueを設定することにより、ガベージコレクターに実行させます。

5

最初にガベージコレクションについて読む必要があります。Grant.Sはこれについての良い記事を書いています。

http://www.gskinner.com/blog/archives/2006/06/as3_resource_ma.html

ポイントは、クラス自体をnullに設定するのではなく、リスナーを含むすべての参照を削除することです。完全に孤立した状態になると、ゴミが一度に拾われる可能性があります。

基本的な例:

// References a newly created Sprite
var reference:Sprite = new Sprite();

// Removes the reference, the Sprite is now orphaned and will probably be garbage collected within some seconds.
reference = null;

すべてのクラスで「destruct」メソッドを体系的に作成して、その内部参照をすべて削除し、ビットマップを破棄し、イベントリスナーを削除するなどの方法をお勧めします。その後、外部リンクのリンク解除について心配する必要があります。

FLEX Builderを使用している場合、プロファイラーを使用して、Flash Playerがこれらすべてを内部で処理する方法を視覚化できます。

1
Theo.T

GSkinner からガベージコレクションを強制するサポートされていない方法を次に示します。

try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.
1
jedierikb

AS3はデストラクタを提供しません。あなたができる最善のことは、すべての参照をnullに設定し、指を交差させておくことです。GCがそれに気づき、メモリを解放します。

1
dirkgently
System.gc()
// Forces the garbage collection process. 

参照:

http://livedocs.Adobe.com/flash/9.0/ActionScriptLangRefV3/flash/system/System.html

1