关于单例是否会引发内存泄露,是否需要释放内存的一些思考
一、概述
昨天去面试Android岗位,有这么一个问题:你项目中的单例是否需要释放内存? 我说:只要写的正确(不持有全局引用就不需要说动释放/或者担心内存泄露)。他说:不对,单例是需要释放内存的。
二、思考
首先看一下什么是单例:
1.构造方法私有(外部无法创建实例只能自己创建自己的实例)
2.提供一个供外部调用该实例的接口
正常情况下的单例:
1 2 3 4 5 6 7 8 | private ActivityUtils(){} private static ActivityUtils instance = null ; public static ActivityUtils getInstance(){ if (instance== null ){ instance = new ActivityUtils(); } return instance; } |
像这种单例,是不需要去释放内存以及担心内存泄露的,因为没有单例是全局唯一的,也就是App如果不销毁,单例它一直都是存在的。又因为没有持有全局的引用所以不需要释放。
什么情况下需要释放?答案是你写的有问题的时候需要释放。如下:
1 2 3 4 5 6 7 8 9 | 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:所以我的观点是,单例如果写的对,不需要释放内存,不用担心内存泄露。大家如果有不同的意见,在评论区一块讨论讨论。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2022-05-05 OpenCV之发现轮廓中心点位置及轮廓方向
2022-05-05 OpenCV使用eigen函数输出特征向量及特征值
2022-05-05 OpenCV输出均值、标准差、协方差