簡體   English   中英

實例化擴展類時的AS3內存管理

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM