2016-01-21 54 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