单例模式引起的内存泄漏

1、单例模式引起的内存泄漏

由于单例的静态特性使得其生命周期跟应用的生命周期一样长,所以如果使用不恰当的话,很容易造成内存泄漏。比如下面一个典型的例子。

public class AppManager {

    private static AppManager instance;

    private Context context;

    private AppManager(Context context) {

          this.context = context;

    }

    public static AppManager getInstance(Context context) {

          if (instance != null) {

                instance = new AppManager(context);

          }

          return instance;

    }

}

这是一个普通的单例模式,当创建这个单例的时候,由于需要传入一个Context,所以这个Context的生命周期的长短至关重要:

1、如果此时传入的是 Application 的 Context,因为 Application 的生命周期就是整个应用的生命周期,所以这将没有任何问题。

2、如果此时传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会被回收,这就造成泄漏了。

正确的方式应该改为下面这种方式:

public class AppManager {

    private static AppManager instance;

    private Context context;

    private AppManager(Context context) {

         // 使用Application 的context 

          this.context = context.getApplicationContext();

  }

    public static AppManager getInstance(Context context) {

          if (instance != null) {

                instance = new AppManager(context);

          }

          return instance;

    }

}

或者这样写,连 Context 都不用传进来了:

在你的 Application 中添加一个静态方法,getContext() 返回 Application 的 context,

...

context = getApplicationContext();

...

//获取全局的context - - >return返回全局context对象

public static Context getContext(){

    return context;

}

public classAppManager{   

    private static AppManager instance;

    private Context context;

    private AppManager() {

         // 使用Application 的context

          this.context = MyApplication.getContext();

}

    public static AppManager getInstance() {

          if (instance != null) {

                instance = new AppManager();

          }

          return instance;

    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容