我对这种情况是否危险有点困惑:
我有一个对象,其中包含对回调侦听器的引用。在对象中的某个事件中,将调用回调侦听器。然后,抽象回调函数的实现将删除对 my 对象的唯一现有引用。当回调返回时,我在事件处理程序中执行其他操作,并且还可以操作成员。
由于现在对此对象的唯一引用已经消失,即使我在事件处理程序中执行其余操作,Dalvik JVM 垃圾收集器也会尝试垃圾回收我的对象吗?这将产生什么后果?
我写了一些简单且相当无用的代码来说明我的情况:
public SomeClass {
public abstract class CallBackListener {
public void abstract callback();
}
private CallBackListener mCb = null;
private OrgObject mObject = null;
public SomeClass() {
mCb = new CallBackListener() {
@Override
public void callback() {
mObject = null;
}
};
mObject = new OrgObject(mCb);
}
}
public class OrgObject {
private SomeClass.CallBackListener mCb = null;
public OrgObject(SomeClass.CallBackListener cb) {
mCb = cp;
}
public void event() {
//call callback
cb.callback();
//do other stuff
}
}
对这种情况和/或做法有什么意见吗?
提前致谢
否;正在运行的线程可访问的对象不符合垃圾回收的条件。
在执行属于对象的方法时,线程始终可以使用this
引用(存储在线程执行堆栈上)访问对象本身,因此不能对其进行垃圾回收。当线程退出该方法时,如果没有其他对对象的引用,则该对象可能是 gc'd。
在任何时候,任何线程现在或将来可能访问的任何内容都不会被垃圾回收。
更具体,非常简化的过程是:垃圾回收器从静态字段和自动变量开始,包括隐式的"this"变量。从那里,它找到从这些类(间接)访问的所有内容,包括从内部类到外部类的隐式引用。然后,未找到的所有内容都将最终确定并删除。
因此,当您的event()方法正在执行时,会找到一个隐式的自动"this"变量,并且您的OrgObject不会被垃圾回收。
这解释了它
但是接受的答案没有考虑回调问题。但有评论表明,这个参考也算作一个有效的参考......但是什么时候无效并开放进行垃圾收集?
当 event() 方法正在执行时,您确实有对 OrgObject (mObject) 的引用。它被称为this
.所以不,GC 不会收集您的对象。此外,如果它收集"执行"类,那将是相当奇怪的。你不觉得吗?