2016-01-21 63 views
0

我想优化我的代码,并有一个小问题。如果我这样做:将变量和对象设置为空有用吗?

TextView currentConsole = (TextView)findViewById(R.id.txt_Mainactvt_currentConsole); 
String currentConsoleName = currentConsole.getText().toString(); 
currentConsole = null; 
FloatingActionButtonClickEvent(currentConsoleName); 

是设置对象为null的一种好方法,或者它是无用的吗?

+0

你为什么要这样? –

+0

将对象设置为null的目的是什么? –

+0

@SamuelKerrien我会知道这是否是一种优化代码的方法。这是无用的,因为它是垃圾收集? –

回答

1

垃圾回收器跟踪对象的引用,并且当没有指向某个对象的指针时,它将被标记为删除。它不会立即删除。所以当你编写currentConsole = null;时,你只需告诉gc控制台对象应该被删除,并且它将在下一个垃圾收集中。

为了优化你可以调用System.gc();这会触发集合,但gc可能会选择忽略它,所以不能保证控制台对象在空指定后将被删除。

垃圾收集间隔是在运行时计算的,主要取决于对象的数量和新分配的频率,所以最好的办法是让GC完成它的工作,在大多数情况下,他会做最好的事情。

最后一般在空任务,是的,他们是在罕见情况下,考虑下面的代码

void testGCMethod() 
{ 
    //Create very big object 
    VeryBigObjectType o = new VeryBigObjectType(); 
    //do dometinh with o 
    o.someMethod(); 

    //Do something that takes long time to complete that doesn't involve o 
    Thread.sleep(1000 * 1000 * 1000); 
}// end of method meaning the o pointer has just been freed and the big object has just been marked for deletion. 

因此,在这种情况下(如果JIT不重新排列码)VeryBigObjectType实例将Thread.sleep代码之前保存在内存中的全部时间,所以一些开发商想要分配Ø由GC

void testGCMethod() 
{ 
    //Create very big object 
    VeryBigObjectType o = new VeryBigObjectType(); 
    //do dometinh with o 
    o.someMethod(); 
    o=null; 


    //Do something that takes long time to complete that doesn't involve o 
    Thread.sleep(1000 * 1000 * 1000); 
}// end of method meaning the o pointer has just been freed and the big 

这样的大物体将被删除(可能)尽快null,以收集并保存一些内存;

+0

尽管这看起来正确,但它不会影响OP代码,因为TextView不会被GC删除,因为应用程序的内部仍然会保存引用(因为它需要显示它)。 – Tom

+1

是的,在我的例子中,关于null是正确的,我是在谈论一般情况,而不是特定情况,但是在他的情况下,null并没有做任何事情。 –

+0

是的,我知道,我只是想指出,在OPs案件中它并没有帮助:P。答案本身并没有错。 – Tom