假设我正在创建一个名为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;
为什么我不能在课堂上这样做?我打算通过设置对弱引用的引用来删除所有事件侦听器,然后使实例无效以将它们全部删除。为什么我不能?
有人帮帮我吗?
答案 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机制的目的是为您完成所有内存管理,因此您可以担心程序的功能。您所要做的就是照顾从正确的地方发送信号。