android匿名内存原理,OnClickListener是匿名内部类为什么不导致android内存泄漏

写内存泄漏的文章很多,再把别人的抄一遍也没意思。

先总结一下,再说OnClickListener是匿名内部类为什么不导致android内存泄漏的问题。

MemoryLeak原因就是,生命周期长的类实例(A)所引用的生命周期短的类(B)实例,在B已经结束生命周期了需要释放时没有释放还被A引用着,导致B不能被GC就出现了内存泄漏。根本原因就是很老套很经典的这句话:没有被释放。

总结起来无非就是几大点:

1 静态变量:如将一个activity实例传递给一个static申明的变量。

2 单实例:单实例引用某些对象(如引用activity,或者activity的context)。

3 数组:例如数组中包含activity,activity走了ondestroy要被销毁了,但是ArrayList中仍然有引用导致不能回收。

4 非静态内部类:非静态内部类会对外部类有引用,外部类生命周期结束后可能还被内部类引用。

5 cursor、stream未关闭。

基本是以上5种,解决方法,网上很多。

思考:

最有意思的,就是4 非静态内部类导致内存泄漏,我非常好奇,我们经常用的OnClickListener是一个非静态的内部类,但是基本不会导致内存泄漏,为什么?

我们根据这个原则:没有被释放 来分析:

1 首先OnClickListener是匿名内部类,肯定会对外部类有引用。

2 而这个new出来的OnClickListener被谁引用呢?当然是将它setOnClickListener的那个view(姑且叫他viewC)。

3 当activity被销毁时,它所包含的所有view也将释放各自所有引用的对象,这当然包括viewC,也会去释放OnClickListener。

4 这样OnClickListener虽然有引用activity,但是OnClickListener不再被任何对象引用,按照GC算法不能到达根,就能被回收了。

怎么样?很神奇是不是?道理就是这样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值