2012-09-14 135 views
2

我有以下代碼:指針和垃圾收集

loadedImageDraggable.setBitmap(bitmap); 
Log.v(TAG, "recycled image1 :"+bitmap); 
Log.v(TAG, "recycled image2 :"+loadedImageDraggable.getBitmap()); 
bitmap.recycle(); 
bitmap = null; 
Log.v(TAG, "recycled image3 :"+bitmap); 
Log.v(TAG, "recycled image4 :"+loadedImageDraggable.getBitmap()); 

所以我希望,當我這個編碼,是位圖對象將得到從內存中刪除。我居然得到了,當我跑的代碼是這樣記錄追蹤:

recycled image1 :[email protected] 
recycled image2 :[email protected] 
recycled image3 :null 
recycled image4 :[email protected] 

您可以在最後一行看到,仍然有此位圖對象周圍,包裹在loadedImageDraggable。由於對象是通過引用傳遞給方法的,我期望java在對象被設置爲null時清除對該位圖對象的所有引用。 我很困惑:/ 有人可以幫我解決這個問題嗎?

+0

這是'loadedImageDragable'類嗎?無論如何,它可能不是它的主要實例,而是一個副本。 – SJuan76

+0

no-在該類中沒有位圖複製操作。內部Bitmap屬性只有一個getter和setter。 – stoefln

回答

1

在進一步解釋之前,我想給你一個概述回收工作的一般概述。

下面是定義,

公共無效再循環() 自:API級別1 bitmap.recycle() 免與該位圖相關聯的原生對象,並清除參考像素數據。這不會同步釋放像素數據;它只是允許它被垃圾收集,如果沒有其他引用。位圖被標記爲「死」,這意味着它將拋出一個異常,如果getPixels()或setPixels()被調用,並且不會畫任何東西。這個操作不能顛倒過來,所以只有在你確定沒有進一步的位圖使用時才應該調用它。這是一個高級調用,通常不需要調用,因爲當沒有更多的位圖引用時,普通的GC進程將釋放該內存。

在你的情況下,你仍然持有對位圖對象的引用..但調用了使位圖可繪製DEAD。

當您通過setBitmap(null)使您的loadedImageDraggable無效時。它將有資格獲得GC。

即使GC操作依賴於幾個條件,其中一個是資源飢餓。在那之前你永遠不知道它會被收集。希望這會給你一個更好的理解。

+0

謝謝 - 有沒有辦法確保每個參考被刪除?我的意思是讓我說我​​有20個對象使用這一個圖像,我真的必須手動跟蹤它們並將每個指針設置爲null嗎? – stoefln

+0

是的,使用'finalize(){// Release here}'或'try-fianlly {// Release here}'會讓你的代碼更加一致。 –

2

您有兩個對同一個位圖對象的引用。一個是bitmap另一個是loadedImageDraggable 現在如果你設置bitmap爲空loadedImageDraggable的引用當然不會改變。它仍然指向你的位圖@ 41afa8e0

+0

謝謝,有沒有辦法確保每個參考被刪除?我的意思是讓我說我​​有20個使用該圖像的對象,我真的必須手動跟蹤它們並將每個指針設置爲null嗎? – stoefln