Observable回调中传递局部变量的有效性及内存回收问题
问题解答
是的,只要Some类的实例和Observable的回调处于活跃状态,Object实例o就会一直驻留内存,不会被垃圾回收。
具体原因如下:
- 在
method()方法中创建的o,被传递给了observable.observe的回调Lambda表达式,这个Lambda会持有o的强引用。 observable是Some类的成员变量,只要Some的实例还处于活跃状态(未被回收),observable就会持续存在,它所保存的回调Lambda也会一直被持有。- 此时存在一条完整的强引用链:
Some实例 →observable→ 回调Lambda →o,垃圾回收器不会回收存在强引用的对象,所以o会一直保持有效。
补充说明:
- 如果后续
observable移除了该回调(比如调用取消订阅的方法),或者Some的实例被垃圾回收,那么回调Lambda和o之间的引用链就会断裂,o会在合适的时机被垃圾回收。
内容的提问来源于stack exchange,提问作者ir2pid
相关产品推荐
相关产品推荐

