我对软/弱引用看了也不少博客,但是还是有一点疑问,尤其是android 2.3
之后的软/弱引用机制
尝试搜索无果后,来这里请教一下,问题应该很简单,但是对我来说很困惑有点绕不过来弯.
谢谢
ViewStub
和其他很多地方都有用到WeakReference
弱引用不是在系统GC的时候如果它只被一个软引用所引用,那么它将会被回收吗?
在ViewStub
的源码中,在inflate()
一个ViewStub
的之后
同时将inflate()
完毕的view
添加至新创建的WeakReference
中,
那么这个view
不就只?
被一个软引用所引用了吗?
如果这时系统GC
那么view是不是被回收了?那么下次想从WeakReference
中获取它的时候是不是又可能会为null
?从而导致错误?
或者说这种情况是不会被系统GC
的? 望大鸟指教一下愚昧小弟
PHPz2017-04-18 09:08:48
我覺得你對WeakReference機制的理解沒問題,對ViewStub程式碼的理解不對
ViewStub 和其他很多地方都有用到WeakReference
弱引用不是在系統GC的時候如果它只被一個軟引用所引用,那麼它將會被回收嗎?
會
在ViewStub的源碼中,在inflate() 一個ViewStub的之後
同時將inflate()完畢的view添加至新創建的WeakReference 中,
那麼這個view 不就只引用了嗎?
相關物件的引用關係是這樣的:
inflate()第一次执行前:
parentView --强-> stubView
此时inflatedView还不存在
inflate()第一次执行后:
parentView --强-> inflatedView
stubView --弱->inflatedView
此时parentView已经不引用stubView了,stubView在inflate()中用inflatedView替换了parentView中的自己
所以inflatedView仍然被強烈引用,不會被GC