2011-06-26 47 views
1

我不知道這段代碼是否會導致內存泄漏?因爲我仍然不知道什麼時候應該放置紋理。紋理應該放在方法的最後?或在未使用後分開處置?將在方法範圍內的紋理聲明導致內存泄漏?

private void loadAssets() { 
    Texture texture = new Texture(Gdx.files.internal("data/controls.png")); 
    TextureRegion[] buttons = TextureRegion.split(texture, 64, 64)[0]; 
    left = buttons[0]; 
    right = buttons[1]; 
    jump = buttons[2]; 
    cubeControl = buttons[3]; 
    cubeFollow = TextureRegion.split(texture, 64, 64)[1][2]; 
    dpad = new TextureRegion(texture, 0, 64, 128, 128);  
    batch = new SpriteBatch(); 
    batch.getProjectionMatrix().setToOrtho2D(0, 0, 480, 320); 
} 

我真的不明白。爲什麼Java中仍然存在內存泄漏?

+0

爲了解決「Java爲什麼仍然存在內存泄漏」問題,儘管Java有GC,但它仍然可能存在內存泄漏(但技術上與c/C++不同)。它通常發生在你實例化一個對象(直接/間接)並且代碼在某處維護一個不明確的引用。該對象將永遠不會被GCed。這就是我們所說的Java中的內存泄漏 – Santosh

回答

6

看着TextureRegion的來源,它保留了對Texture的引用,但並不真正把它的「所有權」 - 它永遠不會自行處理它。

通過走出去,你不應該在方法結束它脫手,但你應該處置時cubeFollowcubeControldpad都完成了 - 我懷疑將是當實例本身完成。 (這可能是也可能不是說你需要一個終結器 - 這取決於你是否對這個對象的生命週期有一些控制。)

請注意,你不需要單獨的字段來存儲對Texture的引用 - 你可以使用dpad.getTexture()dpad得到它。