关于单例是否会引发内存泄露,是否需要释放内存的一些思考
一、概述
昨天去面试Android岗位,有这么一个问题:你项目中的单例是否需要释放内存? 我说:只要写的正确(不持有全局引用就不需要说动释放/或者担心内存泄露)。他说:不对,单例是需要释放内存的。
二、思考
首先看一下什么是单例:
1.构造方法私有(外部无法创建实例只能自己创建自己的实例)
2.提供一个供外部调用该实例的接口
正常情况下的单例:
private ActivityUtils(){} private static ActivityUtils instance = null; public static ActivityUtils getInstance(){ if(instance==null){ instance = new ActivityUtils(); } return instance; }
像这种单例,是不需要去释放内存以及担心内存泄露的,因为没有单例是全局唯一的,也就是App如果不销毁,单例它一直都是存在的。又因为没有持有全局的引用所以不需要释放。
什么情况下需要释放?答案是你写的有问题的时候需要释放。如下:
private Context context; private ActivityUtils(Context context){} private static ActivityUtils instance = null; public static ActivityUtils getInstance(Context context){ if(instance==null){ instance = new ActivityUtils(context); } return instance; }
此时由于单例持有了Context引用(可能是fragment或者Actiivty),此时如果不手动释放会有内存泄露的风险。但是说实话,正常人谁会这样干,这不是妥妥的增加维护成本吗?
ps:所以我的观点是,单例如果写的对,不需要释放内存,不用担心内存泄露。大家如果有不同的意见,在评论区一块讨论讨论。