[英]AS3 Memory management when instantiating extended classes
我正在開發一個AS3應用程序,該應用程序有一些我找不到的內存泄漏,所以我想問一些關於內存管理的新手問題。
想象一下,我有一個名為BaseClass的類,以及一些擴展了該類的類,例如ClassA,ClassB等。
我聲明一個變量:
myBaseClass:BaseClass = new ClassA();
一段時間后,我用它實例化一個新對象:
myBaseClass = new ClassB();
一段時間后
myBaseClass = new ClassC();
計時器觸發每x毫秒都會發生相同的事情。
這里有內存問題嗎? 垃圾收集器是否正確刪除了未使用的實例?
謝謝!
假設您沒有對該實例(或實例的內容)的其他引用,則垃圾收集器將清理它們。 但是,據我所知,清理前的時間是不確定的(可能使用了一些艱苦的時間表,但我從未見過有記載)。 如果要創建大量實例,則在清理第一個實例之前,可能會占用大量內存。
有一個AS調用(此名稱此刻使我不知所措)來強制GC運行,但通常沒有必要。 如果發現有必要,幾乎可以肯定,您需要重新考慮應用程序的工作方式。
如果myBaseClass是唯一存儲的對
新的ClassA()
然后將其他東西分配給myBaseClass
新的ClassB()
那么將沒有指向ClassA的引用,並且垃圾收集器在運行時應該找到它。
但是,如果將myBaseClass提供給存儲其自己對該對象的引用的庫或類,則當您重新分配myBaseClass時,仍將存在指向ClassA的引用,並且垃圾收集器不會對其進行清理,從而導致內存泄漏。 通常,編寫良好的庫將為您提供刪除引用的方法。 例如
var child:Sprite = new Sprite()
// one reference to the new Sprite
stage.addChild(child); // assume stage stores reference
// two references to the new Sprite
/**
* assume the following:
*
* child = null;
*
* one reference would still remain in stage
* garbage collector will not clean up the sprite
*/
stage.removeChild(child); // assume stage clears reference
// one reference left
child = null;
// no reference to the sprite, garbage collector will clean it up
希望這能使事情順利進行。 本質上,如果您懷疑某個對象正在泄漏內存,則希望跟蹤該對象有多少個引用。
我知道FlashDevelop的探查器對於發現這些錯誤非常有用。 另外,您還需要知道,當垃圾收集器運行時,它將釋放內存並為您的內存探查器提供鋸齒圖案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.