2

在我的文档类中,我将一些放置在舞台上的对象分配给一个数组,以便稍后调用它们。

当我在构造函数之外声明数组时,对象还没有被创建并且赋值为空,这与我在构造函数中声明它们时不同。 为什么会这样?

我怎样才能避免这种情况?我可以使用侦听器来跟踪加载对象的时间吗?

第一个案例

package { 
   public class Document extends MovieClip {
       var obj:Array = [object1,object2];
       public function Document() {
          trace(obj[0]); // <-- null
       }
   }
}

第二种情况

package { 
   public class Document extends MovieClip {
       public function Document() {
          var obj:Array = [object1,object2];
          trace(obj[0]); // <-- reference value
       }
   }
}

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

4

3 回答 3

3

全局变量(即任何方法之外的变量)在任何东西之前、调用构造函数之后和执行之前加载

请改用此代码:

package { 
   public class Document extends MovieClip {
       var obj:Array;
       public function Document() {
          obj = [object1,object2];
          trace(obj[0]);
       }
   }
}

附录:

Stage 对象在构造函数代码的顶部初始化,例如设计器对象在.net中。

因此,由于全局变量在执行构造函数代码之前object1被初始化,并且object2仍然是null.

附录 2:

您有以下顺序:

  1. 类的构造函数被调用
  2. 全局变量被初始化(你的obj数组,还有object1/object2变量,但不是它们的值)
  3. Designer(你在舞台上的图形)对象被初始化(即object1 = new Object1()调用)
  4. 构造函数代码被执行

舞台对象总是自动声明和初始化,除非您在高级 AS 设置中取消选中自动声明舞台实例。

于 2012-12-07T11:44:47.883 回答
1

在外面声明数组,在构造函数里面填充值。

public class Document extends MovieClip {
   var obj:Array;
    public function Document() {
      obj = [object1,object2];
      trace(obj[0]); // <-- reference value
   }
}

无论你写什么作为初始化值都会首先处理,嵌入在编辑器中的任何东西都是第二个,构造函数代码是第三个。因此,当您在初始化代码中按名称引用资产时,它们尚未初始化,因此您会收到空值。

无论您使用什么侦听器,都只会在对象可用后应用。如果您需要舞台参考以将您的代码控制资产与给定的舞台尺寸对齐init(),并且监听器非常有用。ADDED_TO_STAGE在此之前,阶段引用为空。

于 2012-12-07T11:43:04.153 回答
-2

嗯,这有点模糊。这些对象在哪里实例化?我建议确保它们在您的课程中被实例化:

package
{
    public class Document extends Sprite //I don't think you really need MovieClip
    {
        //alternatively to the method bellow you could use something like:
        //
        // private var object1 : Object = new Object();
        // private var object2 : Object = new Object();
        // public var obj : Array = [object1, object2];
        //
        // just make sure they are instantiated before they are used in the obj contructor

        public var obj : Array = [new Object(),new Object()]; //again here I would suggest using a vector if they are the same type

        public function Document()
        {
            trace(obj[0]);
        }
    }
}

如果这些对象在类外部,我建议将它们传递给构造函数,如下所示:

package
{
    public class Document extends Sprite //I don't think you really need MovieClip
    {
        public var obj : Array = [null,null]; //again here I would suggest using a vector if they are the same type

        public function Document(o1:Object=null,o2:Object=null)
        {
            if (o1 != null)
                obj[0] = o1;
            if (o2 != null)
                obj[1] = o2;
            // 
            if (obj[0] != null)
                trace(obj[0]);
            else
                trace("Obj[0] is null");
        }
    }
}

[稍后编辑] 至于发生这种情况的原因是因为在数组初始化时这两个是空的(它们还没有被初始化)

[稍后编辑2] 好的 - Document 是 flash 的根类 - 很高兴知道就像我在评论中所说的那样,即使在舞台上这两个对象在添加到舞台之前不会被实例化。为此,我建议收听 ADDED_TO_STAGE 事件。如果您将它们传递到构造函数之外,则在创建数组时它们将为空,因为它们尚未添加到阶段/创建(与普遍的看法相反,即使在 Flash 中,对象也不会简单地存在)

于 2012-12-07T11:51:21.967 回答