2010-04-09 48 views
1

下面的方法會被調用很多次。我擔心連續調用新的矩形會增加潛在的不必要的內存消耗,或者是用於生成上一個矩形的內存被釋放/覆蓋以容納另一個矩形,因爲它被分配給相同的實例變量?關於AS3中內存管理的快速提問

private function onDrag(evt:MouseEvent):void 
     { 
     this.startDrag(false, dragBounds()); 
     } 

private function dragBounds():Rectangle 
    { 
    var stagebounds = new Rectangle(0 - swatchRect.x, 0 - swatchRect.y, stage.stageWidth - swatchRect.width, stage.stageHeight - swatchRect.height); 
    return stagebounds; 
    } 

回答

4

這是一個快速的問題,但非常重要!即使考慮到這些,ActionScript開發人員的關注程度也不夠。所以對你很贊!

每當您創建一個新的矩形時,都會爲其分配新的內存。只要所有對該矩形的引用都被刪除,它就變成合適的用於垃圾回收(GC),這意味着下一次GC運行時它將從內存中釋放。 (在這種情況下,當你調用stopDrag()所有的引用都被刪除)

Rectangle一個實例需要很少的內存了,並在定期運行的垃圾收集,情況會不斷地清理。另外,我們可以確定,在沒有以前的實例可用於GC的情況下,在任何給定時間不會創建超過一個。 (假設您在再次致電dragBounds之前致電stopDrag)。

真的,這是一種您不需要擔心的情​​況。你的代碼沒問題。在遇到任何潛在問題之前,您需要成千上萬的矩形(一次數百萬)。

+0

謝謝你的迴應,泰勒。所以我現在明白,stopDrag()將從startDrag()中刪除引用。但是如果dragBounds()被多次調用但未被startDrag()調用呢?假定矩形是一個大型的內存佔用對象。我是否會讓它成爲實例變量,以便在創建一個像這樣的新類之前取消整個類的實例變量? - if(stageBounds){stageBounds = null}; stageBounds = new Rectangle(...); - – TheDarkIn1978 2010-04-09 03:44:15

+1

如果忽略某個值,則不會將其從內存中釋放,只會刪除該引用,並可能使其可用於GC。只要所有參考資料都清理完畢,GC就會找到並刪除它。你不能強迫這發生。對於大對象,您可以重用它們,而不是創建新的對象。如果創建一個新版本的成本高於維護一個你知道你很快就會需要的版本,這可能是有益的。 – 2010-04-09 03:50:56