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;


基本上,该错误意味着您不能从类的实例内部使对象无效,您只能从外部使对象无效,而您已经在这样做了。

所以删除函数'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 
}

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

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

于 2012-07-18T08:00:26.820 回答
0
this = null;
hitchhiker = null;

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

于 2012-07-18T08:07:11.553 回答
0

指针是编程语言的this自动功能,而不是“常规”变量实例,这就是为什么您不能将其设置为null. 变量实例必须被声明赋值,对于this. 当然,它也不影响垃圾回收,所以绝对不需要清除它。

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

  • 如果保留对象可以将自己的实例设置为null,则它必须了解其“父”类的结构——这会破坏封装,产生非常强的耦合,违反单一职责原则,并导致僵化和脆弱代码。不是一个好主意。因此,我们应该让实际持有引用的类决定何时使用它
  • 如果将同一个对象实例分配给多个变量怎么办?如果在某个点丢弃了对象,则某些引用可能仍在使用中 - 这会使您的应用程序面临过多的内存分段错误。为了防止这些,您总是必须手动跟踪使用引用的所有位置,并确保在删除之前不再需要它。你能想象这涉及到多少工作吗?也就是说,如果您自己在编译之前在代码中执行此操作。
  • 但是等一下,你总是可以……嗯……想一个自动机制来在运行时跟踪变量引用!它将记录它们的使用位置,在收到信号表明持有它的类不再需要它时清除每个引用,检查是否存在任何其他引用,并最终在所有引用都消失后释放内存。好想法!现在我们要考虑的是如何实现那个信号......感谢上帝,它已经完成了: 将变量设置为null意味着:“我不再需要这个了。” - GC 机制的目的是为您完成所有内存管理,因此您可以担心程序的功能。您所要做的就是注意从正确的位置发送信号。
于 2012-07-18T09:17:20.367 回答