随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

关于单例是否会引发内存泄露,是否需要释放内存的一些思考

一、概述

  昨天去面试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:所以我的观点是,单例如果写的对,不需要释放内存,不用担心内存泄露。大家如果有不同的意见,在评论区一块讨论讨论。

posted on   飘杨......  阅读(277)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
历史上的今天:
2022-05-05 OpenCV之发现轮廓中心点位置及轮廓方向
2022-05-05 OpenCV使用eigen函数输出特征向量及特征值
2022-05-05 OpenCV输出均值、标准差、协方差
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示