1

我是一名 C# 开发人员,正在尝试学习一些 AS3,所以这将是一个非常新手的问题。

我对范围和 GC 感到困惑,因为我有一个自定义的 MovieClip 扩展类 (Slide),我在循环中创建实例并将 push() 放入一个数组中,但是之后当我拉取它们时这些项目为空出集合。

var ldr:URLLoader = new URLLoader();
ldr.load(new URLRequest("presentation.xml"));
ldr.addEventListener(
    Event.COMPLETE,
     function(e:Event):void {
         config = new XML(e.target.data);
         for (var i:Number = 0; i < config.slides.slide.length(); i++)
         {
             var node = config.slides.slide[i];
             var slide:Slide = new Slide();                      
             slides.push(slide);

             addChild(slide); // Works fine
         }
     }
);

slides.forEach(function(e:*, index:int, array:Array):void
    {
        addChild(e); // Causes "Parameter child must be non-null" exception
    }
);

我希望以后能够引用幻灯片,以便根据需要切换它们 - 如何保持对新对象的引用?

更新:这似乎有两个问题。在调用 URLLoader 的完整事件之前进行了 forEach 调用,而且 forEach 似乎也没有按预期工作。这是最终的工作代码:

var ldr:URLLoader = new URLLoader();
ldr.load(new URLRequest("presentation.xml"));
ldr.addEventListener(
    Event.COMPLETE,
    function(e:Event):void {
        config = new XML(e.target.data);
        for (var i:Number = 0; i < config.slides.slide.length(); i++)
        {
            var node = config.slides.slide[i];
            var slide:Slide = new Slide();                      
            slides.push(slide);
        }
        for each (var sl in slides)
        {
            addChild(sl);
        }
    }
);
4

2 回答 2

3

您的 slides.forEach 调用在事件被触发之前执行,因此 slides 数组没有值。

于 2009-05-16T15:45:44.710 回答
1

试试这个。让我们看看它是否会跟踪您的幻灯片。

var ldr:URLLoader = new URLLoader();
ldr.addEventListener(Event.COMPLETE, processXML);
ldr.load(new URLRequest("presentation.xml"));

function processXML(e:Event):void {
    config = new XML(e.target.data);
    var slide:Slide;
    for (var i:Number = 0; i < config.slides.slide.length(); i++)
    {
        var node = config.slides.slide[i];
        slide = new Slide();                                          
        slides.push(slide);

        addChild(slide); // Works fine
    }

    for each(var slide:Slide in slides){
        trace(slide);
    }
 }

我在这里编码,所以我不能保证它会工作。另外,我没有剩下的代码,所以你必须自己测试它。

于 2009-05-16T18:28:02.370 回答