AS3:为什么我不能在其类中将实例设置为null?

时间:2012-07-18 07:53:23

标签: actionscript-3 null

假设我正在创建一个名为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;

为什么我不能在课堂上这样做?我打算通过设置对弱引用的引用来删除所有事件侦听器,然后使实例无效以将它们全部删除。为什么我不能?

有人帮帮我吗?

3 个答案:

答案 0 :(得分:2)

您首先在哪里定义了课程?这就是你定义类的方法:

package xyz {

    public class Hitchhiker {

        public function Hitchhiker():void {

        }

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

除了你的错误,来到这里:this = null;

<小时/> 基本上,错误意味着您不能从类的实例内部使对象无效,您只能从外部使对象无效,您已经在做。

因此删除“nullify”函数。


使用dispatchEvent的示例:

public function nullify():void { 

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

您可以通过以下方式收听:

obj.addEventListener("destroyMe", destroyObject);

function destroyObject(event:Event):void { 

            // set your object to null here 
}

或者更好的方法是使用Arrays来跟踪创建的对象。

但我仍然不确定为什么你不希望GC处理这个问题。

答案 1 :(得分:0)

this = null;
hitchhiker = null;

这些行为并不相同。实际上,第一个是毫无意义的行动。如果要为GC准备对象,则应删除所有引用。

答案 2 :(得分:0)

this指针是编程语言的自动功能,而不是“常规”变量实例,这就是您无法将其设置为null的原因。变量实例必须声明分配this都不是。当然,它也不会影响垃圾收集,所以绝对没有必要清除它。

但除了这些语言特定的细节之外,还有一些有趣的普遍事实适用于大多数或所有OO语言:

  • 如果保留的对象可以将自己的实例设置为null,则必须知道其“父”类的结构 - 它打破了封装,创建了非常强的耦合,违反了{{ 3}},并导致严格而脆弱的代码。不是个好主意。因此,我们应该让实际持有引用的类决定何时使用它
  • 如果将同一个对象实例分配给多个变量怎么办?如果丢弃对象有一个点,则某些引用可能仍在使用中 - 这会将应用程序打开过多的内存分段错误。为了防止这些错误,您必须手动跟踪在删除之前,所有使用引用的地方,并且绝对确定不再需要它。你能想象这涉及到多少工作吗?也就是说,如果您在编译之前自己在代码中执行此操作。
  • 但是等一下,你总是可以......嗯......想想一个在运行时跟踪变量引用的自动机制!它将记录它们的使用位置,当接收到信号时,清除每个引用,不再需要由持有它的类,检查是否存在任何其他引用,并最终释放一切都消失了。很好的主意!现在我们要考虑的是如何实现这个信号......并且感谢天堂,它已经完成了:将变量设置为null意味着:“我不再需要它了。 “ - GC机制的目的是为您完成所有内存管理,因此您可以担心程序的功能。您所要做的就是照顾从正确的地方发送信号。