2做同样事情的不同方式(即从数据库中获取消息)
致电班级:
ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage(messages);
数据库类:
public ArrayList<String> getAllMessage(ArrayList<String> m) {
m= /* get messages from DB */
return m;
}
致电班级:
ArrayList<String> messages = new ArrayList<String>();
messages = Db.getAllMessage();
数据库类:
public ArrayList<String> getAllMessage() {
ArrayList<String> temp = new ArrayList<String>();
temp = /* get messages from DB */
return temp;
}
我的问题是,场景2 ,
在谈话视频 Android Application Architecture (Android Dev Summit 2015) 中,Adam Powell提到GC是您的敌人,并建议在Android应用的情况下使用场景1。
答案 0 :(得分:2)
变量本身将超出范围并被释放(因为调用堆栈缩小)。
变量指向的对象(ArrayList)仍然有另一个指向它的引用,因此不会被收集。
当没有更多引用(例如您的messages
变量或字段)存在时,它将会消失。
这不是内存泄漏。
在这两种情况下,在调用函数之前创建空ArrayList是没有意义的(并且你应该问自己一旦收到新函数会发生什么,就像你担心temp
一样.Don&# 39;不用担心,它只是毫无意义,没有危险,或者是“泄漏”。#/ p>
请改为:
ArrayList<String> messages = Db.getAllMessages();
答案 1 :(得分:0)
这两种情况没有区别。
r.h.s.上的空数组列表在方案1中,立即有资格获得GC。
对场景2中数据库类创建的临时值的引用将传递回调用方。它是数据库方法的本地,因此引用超出范围,其引用计数减1。
两者都没有泄漏,除非调用类挂起从数据库类返回的引用太长时间。