在Objective-C中,任何属性都可以具有弱属性,这意味着它不拥有传递的对象。如果此对象变为nil(或者在Java中为null),则此属性也将为nil(或null)。此属性所在的对象不拥有传递的对象。
现在用Java,我该怎么做?
更新
为了更清楚,这是究竟发生了什么。这是一款Android应用。我有一个Fragment-A(在Activity-A里面)。 Fragment-A将自身传递给对象-B(属性名称是请求者。我用它来跟踪对象-B的调用方式)。稍后,当用户按下Activity-A时,我删除了Object-B。但是,我收到“ android - 无法销毁活动java.lang.NullPointerException ”。
我怀疑这是一个弱引用问题。这就是我问我问题的原因。
更新2: 崩溃与弱参考无关。但是,很高兴知道如何实施,我做到了。谢谢你的所有答案。
答案 0 :(得分:2)
我认为你会发现http://docs.oracle.com/javase/7/docs/api/java/lang/ref/WeakReference.html很有用。
WeakReference<Object> ref = new WeakReference<Object>(new Object());
...
Object newRef = ref.get();
if ( newRef == null ) {
//Use newRef reference to Object as needed
} else {
//Object has been released by the GC
}
答案 1 :(得分:2)
在Java中,您可以使用WeakReference
。
例如:
WeakReference<Integer> myWeakInt = new WeakReference<Integer>(5);
摘自文件:
假设垃圾收集器确定某个点 一个对象弱可达的时间。那时它会 原子地清除对该对象的所有弱引用以及所有弱对象 引用任何其他弱可达对象 可以通过一系列强大的软引用来访问对象。在 同时它将宣布以前所有的弱可达性 对象可以最终确定。在同一时间或稍晚时间 将那些已注册的新清除的弱引用排入队列 参考队列。
您可以在官方文档中阅读更多有关弱引用的内容,但我认为this文章可以更好地用更少的词语来表达。
答案 2 :(得分:0)
在Java中,您不需要知道内存管理的所有权,因为它有一个可靠的gabage集合,也可以处理循环引用。
如果您计划在序列化的上下文中使用它,您会发现Java的WeakReference
不是Serializable
,并且Java的序列化机制不如Objective-C先进。它没有弱序列化引用的概念,它们不会触发自己的序列化,但如果被引用的对象由于来自其他地方的强引用而仍然被序列化,则它仍然有效。在Java中,您只能在这些情况下生成引用transient
,这意味着它永远不会被序列化并且也不会被还原,然后您需要通过实现readObject
方法手动恢复引用,这需要您知道关于对象的替代访问路径。令人遗憾的是,它比Objective-C更加繁琐。