常識
- 非靜態(tài)內(nèi)部類(包括匿名內(nèi)部類:)默認會持有外部類的引用
- 靜態(tài)內(nèi)部類不會持有外部類的引用
- 靜態(tài)存儲區(qū)(存儲靜態(tài)數(shù)據(jù),全局的static數(shù)據(jù)),在程序運行中,它都存在
情況一:
在單例模式中,使用的是靜態(tài)的對象,所以該對象不能引用生命周期比他短的實例(比如activity的context),要保證他持有的對象跟他自己的生命周期一樣長
情況二:使用非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實例
非靜態(tài)內(nèi)部類會持有外部類的對象,而再用此非靜態(tài)內(nèi)部類去創(chuàng)建了靜態(tài)的對象,靜態(tài)對象生命周期跟app的生命周期一樣長,這就導致外部類釋放不掉
實例
handle使用:handle是一個匿名內(nèi)部類,所以使用它時默認會持有外部類的對象(activity),當外部引用(如activity)提前銷毀時,但是handle還沒有處理完全部消息時,就會造成內(nèi)存泄漏。所以一般都將handle設為靜態(tài)內(nèi)部類,這樣就不會引用外部類,但是如果需要使用外部類的對象時,可以將其設為軟引用,方便gc回收
asynTask和runnable : 都屬于匿名內(nèi)部類,如果外部的引用提前銷毀了(如activity),但是asyntask的任務還沒有執(zhí)行完,則會造成內(nèi)存泄漏。所以默認都設置為靜態(tài)內(nèi)部類,要使用外部對象時,將其設置為軟引用,方便gc回收
3.資源未釋放造成的內(nèi)存泄漏,如注冊與取消注冊問題,bitmap的回收等等。