常识
- 非静态内部类(包括匿名内部类:)默认会持有外部类的引用
- 静态内部类不会持有外部类的引用
- 静态存储区(存储静态数据,全局的static数据),在程序运行中,它都存在
情况一:
在单例模式中,使用的是静态的对象,所以该对象不能引用生命周期比他短的实例(比如activity的context),要保证他持有的对象跟他自己的生命周期一样长
情况二:使用非静态内部类创建静态实例
非静态内部类会持有外部类的对象,而再用此非静态内部类去创建了静态的对象,静态对象生命周期跟app的生命周期一样长,这就导致外部类释放不掉
实例
handle使用:handle是一个匿名内部类,所以使用它时默认会持有外部类的对象(activity),当外部引用(如activity)提前销毁时,但是handle还没有处理完全部消息时,就会造成内存泄漏。所以一般都将handle设为静态内部类,这样就不会引用外部类,但是如果需要使用外部类的对象时,可以将其设为软引用,方便gc回收
asynTask和runnable : 都属于匿名内部类,如果外部的引用提前销毁了(如activity),但是asyntask的任务还没有执行完,则会造成内存泄漏。所以默认都设置为静态内部类,要使用外部对象时,将其设置为软引用,方便gc回收
3.资源未释放造成的内存泄漏,如注册与取消注册问题,bitmap的回收等等。