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

飘杨...... / 2023-05-05 / 原文

一、概述

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