Android 单例模式引起的内存泄漏

一、有关内存泄漏

  首先什么是内存泄漏呢?所有的对象在内存中都应该善始善终,在不需要使用的时候被回收掉,但是当回收的时候有一个正在使用的对象持有了它的引用,使得该对象留在堆内存中从而引起了内存泄漏。


二、单例模式

  单例模式是在实际开发中非常常用的一个设计模式,使用单例模式可以保证在开发过程中一个类只拥有一个实例。


三、具体分析

  首先来看一段代码

 

public class SMSVerifyManager {

    private static final String TAG = "SMSVerifyManager";

    private Context context;

    private static SMSVerifyManager instance;

    private SMSVerifyManager(Context context) {
        this.context = context;
    }

    public static SMSVerifyManager getInstance(Context context) {
        if (instance == null) {
            instance = new SMSVerifyManager(context);
        }
        return instance;

    }
}

 这是一种很常见的写法,在构造方法里传入context,但是这个context的来源如果不加注意,很容易因为生命周期的长短而引起内存泄漏。请在这里传入Application的context而不是Activity的context,因为如果传入的是Activity的context,当Activity退出时,此context并不会被回收,因为单例对象持有该context的引用,从而引起内存泄漏。如果传入的是Application的context,便不会引发内存泄漏,因为context的生命周期和Application一样长,所以正确的单例写法如下


public class SMSVerifyManager {

    private static final String TAG = "SMSVerifyManager";

    private Context context;

    private static SMSVerifyManager instance;

    private SMSVerifyManager(Context context) {
        this.context = context.getApplicationContext();
    }

    public static SMSVerifyManager getInstance(Context context) {
        if (instance == null) {
            instance = new SMSVerifyManager(context);
        }
        return instance;

    }
}

猜你喜欢

转载自blog.csdn.net/sinat_33150417/article/details/77386791