Fragment销毁(调用onDestroy())时其内部对象是否会被销毁?
Fragment销毁时内部对象的生命周期问题
嘿,其实你这两个问题核心是同一个点,我来给你掰扯明白~
首先得理清Fragment的生命周期逻辑:当Fragment的onDestroy()方法被调用时,Fragment的实例本身并没有被销毁,它只是走到了生命周期的销毁阶段(紧接着会触发onDetach(),之后才会真正从FragmentManager中解绑)。这时候Fragment对象还存留在内存里,直到没有任何引用指向它,才会被GC(垃圾回收器)处理回收。
那内部对象的情况得分场景看:
- 如果是Fragment的普通成员变量(比如你定义的自定义工具类实例、数据模型对象等):只要Fragment实例还在内存中,这些对象就会一直存在。只有当Fragment实例被GC回收的时候,这些成员变量才会被标记为可回收——当然,前提是没有其他地方(比如Activity、静态变量)持有它们的强引用,如果有外部强引用,那即使Fragment没了,这些对象也不会被销毁。
- 如果是和View绑定的对象(比如在
onCreateView里创建的TextView、RecyclerView实例):这类对象会在onDestroyView()方法调用时就被销毁(因为View会从视图树中移除,失去引用后会被GC),这个时间点其实是在onDestroy()之前的。
举个实际例子:比如你把Fragment添加到Activity中,之后Activity被销毁,Fragment的onDestroy()会被调用,接着Fragment实例会被解绑,当没有其他引用时,Fragment本身和它的内部成员对象都会被GC回收。但如果你的Fragment内部有个静态成员对象,那这个对象会一直驻留内存,直到APP进程结束。
说白了,核心逻辑就是:Fragment的onDestroy()方法调用≠Fragment实例被销毁,内部对象的销毁与否,取决于它们是否还有有效的强引用,以及Fragment实例本身是否被GC回收。
内容的提问来源于stack exchange,提问作者kent218
相关产品推荐
相关产品推荐

