现在,我们尝试运行如下代码
这个程序很简单,我们可以脑补一下,它应该是启动了又瞬间关闭,但是事实真的是关闭了吗?
稍有常识的人可以看出,它发送了一个Message,将在十分钟后运行,也就是说Message将被保持引用达到10分钟,这就照成了至少10分钟的内存泄露。
最后正确的代码如下
结论
GC是按照有向图是否可达来判断对象实例是否有用
如果不在需要某个实例,却仍然被引用,这个情况叫做内存泄露
匿名类/非静态类内部class会保持对它所在Activity的引用,使用时要注意它们的生命周期不能超过Activity,否则要用static inner class
善于在Activy中的生命周期(比如onPause)中手动控制其他类的生命周期
最后再补充一下iOS的情况,iOS在新版的OC与Swift中,已经引入了新的内存管理体系ARC(auto reference counting,引用自动计数),C代码在编译时,编译器自动适时的添加释放内存的代码。
本文为授权转载文章,任何人未经原授权方同意,不得复制、转载、摘编等任何方式进行使用,e-works不承担由此而产生的任何法律责任! 如有异议请及时告之,以便进行及时处理。联系方式:editor@e-works.net.cn tel:027-87592219/20/21。