0

Hitchhikerというクラスを作成しているとします。

package hi.my.name.is {
    public function Hitchhiker():void {
        // ...
    }

    public function nullify():void {
        this = null;
    }
}

そしてそれは私にエラーを与えます:

Error: Cannot assign to a non-reference value.

一体何?私はあなたがインスタンスをnullに設定することができますが、次のようになります:

var hitchhiker:Hitchhiker = new Hitchhiker();
hitchhiker = null;

なぜクラスでこれができないのですか?参照を弱参照に設定してすべてのイベントリスナーを削除し、インスタンスを無効にしてすべてを削除するつもりです。なぜできないのですか?

誰か助けてくれますか?

4

3 に答える 3

2

そもそもどこでクラスを定義しましたか? クラスを定義する方法は次のとおりです。

package xyz {

    public class Hitchhiker {

        public function Hitchhiker():void {

        }

        public function nullify():void {
            this = null;
        }
    }
}

あなたのエラーに加えて、ここに来ます:this = null;


基本的に、このエラーは、クラスのインスタンス内からオブジェクトを無効化できないことを意味します。すでに行っている外部からのみオブジェクトを無効化できます。

したがって、機能「無効化」を削除します。


dispatchEvent の使用例:

public function nullify():void { 

            dispatchEvent(new Event("destroyMe")); 
}

次の方法で聞くことができます。

obj.addEventListener("destroyMe", destroyObject);

function destroyObject(event:Event):void { 

            // set your object to null here 
}

または、より良い方法は、作成されたオブジェクトを追跡するために配列を使用することです。

しかし、なぜGCにこれを処理させたくないのか、私にはまだわかりません。

于 2012-07-18T08:00:26.820 に答える
0

ポインターは、「通常の」変数インスタンスではなく、プログラミング言語の自動機能です。そのthisため、に設定することはできませんnull。変数インスタンスは宣言して代入する必要がありますが、どちらも当てはまりませんthis。もちろん、ガベージ コレクションにも影響しないので、クリアする必要はまったくありません。

しかし、これらの言語固有の詳細とは別に、ほとんどまたはすべての OO 言語に適用されるいくつかの興味深い普遍的な事実もあります。

  • 保持されたオブジェクトが自身のインスタンスを に設定できる場合、nullその「親」クラスの構造を知る必要があります。これは、カプセル化を破り、非常に強い結合を作成し、単一責任の原則に違反し、厳格で壊れやすいものにつながります。コード。良い考えではありません。したがって、参照を実際に保持しているクラスに、それをいつ使用するかを決定させる必要があります。
  • 同じオブジェクト インスタンスが複数の変数に割り当てられている場合はどうなりますか? オブジェクトが破棄される単一のポイントがあった場合、一部の参照がまだ使用されている可能性があります。これにより、アプリケーションが大量のメモリ セグメンテーション エラーにさらされることになります。それらを防ぐには、参照が使用されているすべての場所を常に手動で追跡する必要があり、削除する前に、参照がそれ以上必要ないことを完全に確認する必要があります。これにはさらに多くの作業が必要になると想像できますか? つまり、これを自分で、コンパイルする前にコードで行う場合です。
  • しかし、ちょっと待ってください。いつでも...うーん...実行時に変数参照を追跡する自動化されたメカニズムを考えてみてください! それらが使用されている場所の記録を保持し、それを保持しているクラスで不要になったというシグナルを受信したときに各参照をクリアし、他の参照が存在するかどうかを確認し、すべてがなくなったら最終的にメモリを解放します。いい案!あとは、そのシグナルをどのように実装するかだけを考えなければなりません...そしてありがたいことに、それはすでに行われています。 変数を に設定すると、null「これはもう必要ありません。」- GC メカニズムの目的は、すべてのメモリ管理を行うことなので、プログラムの機能について心配することができます。あなたがしなければならないのは、適切な場所から信号を送信するように注意することだけです.
于 2012-07-18T09:17:20.367 に答える
0
this = null;
hitchhiker = null;

これらのアクションは等しくありません。実際、最初は無意味な行動です。GC 用にオブジェクトを準備する場合は、すべての参照を削除する必要があります。

于 2012-07-18T08:07:11.553 に答える