Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash AS3中对象的内存使用和垃圾收集_Flash_Actionscript 3_Garbage Collection - Fatal编程技术网

Flash AS3中对象的内存使用和垃圾收集

Flash AS3中对象的内存使用和垃圾收集,flash,actionscript-3,garbage-collection,Flash,Actionscript 3,Garbage Collection,我想知道对象类型,特别是在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);

我想知道
对象
类型,特别是在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);
但是在如下情况下,
对象如何/将如何获得垃圾收集

假设我在类
MartysMC
中有一个函数,我通过以下方式解析
对象

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"});

在您的示例中,创建临时对象,将其传递到函数中,通过其属性进行迭代,然后在下一次GC传递时收集它。内存中没有任何东西可以保存它(虽然GC传递可能不会立即出现,但(目前)还无法确定)。如果您对此有疑问,我会补充一点,即属性访问(
obj[I]
)不会创建对临时对象的引用—只会复制属性(按值复制基本类型,并复制对类的引用)

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

var d:Dictionary = new Dictionary(true)
d[myObject] = whatever
当对象不再可用时,它将从字典中删除

以下是基于wonderfl示例的完整示例:


您可以很快看到,您的两个对象都被垃圾收集。

因此,引用阻止另一个对象被收集的唯一时间是对象本身存储为另一个对象的属性时?例如,mmc.someObject=obj会阻止收集临时obj吗?GC是我在flash中的弱点。你能推荐一些方法来测试它吗?也就是说,当数据对象不再存在时,可能会有什么东西提醒我?@Ascension Systems:是的,没错。GC引用是一种方法——当holder对象消失时,您可以将它们保存到(以前的)对象内容。@Marty Wallace:如果您使用FB,它有内存分析工具。创建许多这样的对象,并拍摄几张内存快照进行比较。它可能无法用纯ActionScript进行测试,恐怕我没有Flash生成器;我使用Flash IDE。酷,字典可以用这种方式监控内存泄漏!