【问题标题】:Memory usage and garbage collection of Objects in AS3AS3中对象的内存使用和垃圾收集
【发布时间】:2011-06-01 07:25:06
【问题描述】:

我想知道 Object 类型,特别是涉及到 Flash 中的垃圾回收。

我知道在这样的情况下,项目将准备好进行垃圾回收:

// create
var ar:Array = [];

var mc:MovieClip = new MovieClip();
mc.addEventLisntener(blah, blah);

ar.push(mc);
addChild(mc);

// kill & gc
ar.splice(0, 1);
mc.removeEventListener(blah, blah);
removeChild(mc);

但是Object 如何/将在以下情况下收集垃圾。

假设我在班级 MartysMC 中有一个函数,我通过以下方式解析 Object

package
{
    import flash.display.MovieClip;

    public class MartysMC extends MovieClip
    {
        /**
         * Updates this
         * @param obj An object containing key/value pairs to represent new property values
         */
        public function update(obj:Object):void
        {
            var i:String;
            for(i in obj)
            {
                this[i] = obj[i];
            }
        }
    }
}

现在我像这样使用这个函数:

var mmc:MartysMC = new MartysMC();

var dataObject:Object =
{
    x: 10,
    y: 34,
    alpha: 0.6
};

mmc.update(dataObject);

dataObject 会发生什么?这会从这里收集垃圾吗?即便如此,这一行中的对象呢:

mmc.update({x:15,y:18,name:"marty"});

【问题讨论】:

    标签: flash actionscript-3 garbage-collection


    【解决方案1】:

    要查看 GC 发生了什么,您可以使用 Dictionary 并将弱引用设置为 true 并使用您要检查的对象作为键:

    var d:Dictionary = new Dictionary(true)
    d[myObject] = whatever
    

    当对象不再可用时,将从字典中删除。

    这里是基于您在 wonderfl 的示例的完整示例: http://wonderfl.net/c/e9W4

    你很快就会发现你的两个对象都被垃圾回收了。

    【讨论】:

    • 酷,Dictionary 可以通过这种方式监控内存泄漏!
    【解决方案2】:

    在您的示例中,临时对象被创建,传递给函数,通过其属性进行迭代,然后应该在下一次 GC 传递时收集它。没有什么可以将它保存在内存中(尽管 GC 可能不会立即通过,但还没有办法(还)确定这一点。)如果您有疑问,我会添加该属性访问(obj[i])不创建对临时对象的引用 - 只是复制属性(按值复制基本类型,并复制类的引用。)

    【讨论】:

    • 因此,唯一会阻止另一个对象被收集的引用是对象本身是否存储为另一个对象的属性?例如, mmc.someObject = obj 然后会阻止临时 obj 被收集? GC是我在flash中的弱点。
    • 你能推荐任何方法来测试这个吗?即当dataObject不再存在时可能会提醒我的东西?
    • @Ascension Systems:是的,完全正确。 GC 引用是一种方式 - 您可以将它们保存在(以前的)对象内容中,而持有者对象已经消失。
    • @Marty Wallace:如果你使用 FB,它有内存分析工具。创建很多这样的对象并拍摄几个内存快照进行比较。它可能无法用纯 ActionScript 进行测试。
    • 恐怕我没有Flash Builder;我使用 Flash IDE。
    猜你喜欢
    • 2023-03-04
    • 2012-10-19
    • 2012-01-03
    • 2017-08-22
    • 2013-10-10
    • 2017-03-15
    • 2012-07-09
    • 2017-10-30
    • 2010-09-16
    相关资源
    最近更新 更多