2016-02-20 14 views
1

如果我有類A和B.然後A具有B的對象,如下和B具有參考A.循環存儲器基準,帶有活動和適配器,演示

class A extends Activity{ 
    private B objectB; 
    public A(){ 
     objectB= new B(this); 
    } 
} 

class B{ 
    private A objectA; 
    public B(A a){ 
     objectA= a; 
    } 
} 

當A類被破壞,它的可變objectB也應該銷燬。那麼objectA會發生什麼?它是否仍然持有參考A甚至objectB被銷燬?或者A不會被垃圾收集即使被破壞因爲objectA有參考嗎?在this issue,類似的情況發生,它被認爲是內存泄漏。

+0

@ Android上的Turing85 Activity類是一個具有視圖的屏幕,所以它會被銷燬。 –

回答

1

在上面的示例代碼中,在AB類之間存在循環引用。這些will be garbage collected如果Application中的任何其他對象實例無法訪問它們。

Activity被摧毀」並不意味着它是垃圾收集。但是,當Activity被垃圾收集時,其變量Views只會被Activity引用,也會被垃圾收集。 我認爲,在ActivityonDestroy(),變量將被分配到null但還是它們的值將分別於內存中,直到他們是垃圾回收。

在寫有問題的鏈接中,Presenter對象引用了Activity,反之亦然。如果Application中的其他對象實例沒有引用它們,它們將被垃圾收集。但是Activityreferenced byPresenter它被Subscription對象引用,它也被一些靜態類引用。

同樣的規則適用於創建Adapter並通過ContextActivity。如果它們都沒有被其他對象引用,則不會有泄漏。但要謹慎,you should passApplication ContextAdapter而不是Activity Context

1

這要看如果A和B的對象的引用是在彼此相同的對象的引用。在編輯示例以包含A和B如何實例化(新增)之後,在您的示例中沒有內存泄漏,因爲每個實例創建的實例不是相同的實例(不同的內存引用)。

根據這兩個類是如何構造或實例化的,在這種情況下可能會創建內存泄漏。上面給出的類的定義沒有足夠的信息來確定是否存在內存泄漏。

例如,給定以下類定義:

class A extends Activity{ 
     private B objectB; 

     public void setB(B b){ 
      objectB = b; 
     } 
    } 

    class B{ 
     private A objectA; 

     public B(A a){ 
      objectA = a; 
     } 
    } 

如果隨後創建的測試類實例A和B如下所示:

class Test(){ 
     public static void main(String... args){ 
      A a = new A(); 
      B b = new B(a); 
      a.setB(b); 
     } 
    } 

在這種情況下,內存泄漏具有被引入,因爲爲B實例化時,被傳遞到一個引用,然後我們明確地設置A中的B相同的乙拿着參照A的這種情況下

當w e。通過一個線改變測試的代碼:

class Test(){ 
     public static void main(String... args){ 
      A a = new A(); 
      B b = new B(a); 
      a.setB(new B()); //Modified this line 
     } 
    } 

現在我們不再有內存泄漏,因爲我們傳遞給A中的B是不相同的實例作爲B保持到A.參考

+0

添加了如何實例化對象 –

+0

第一個示例是我的情況,爲什麼有泄漏? –

+1

這不是內存泄漏。 – pczeus

相關問題