Flash / AS3安全性 - 将movieclip引用传递给子swf?

时间:2010-01-26 15:47:40

标签: flash actionscript-3 security preloader

我在预加载器和主应用程序类(所有AS3 / Flash CS4)之间的交互方面看到了一些奇怪的行为。粗略地说,这是事件的流程:

  1. Preloader.swf加载两件事:main.swf,它是主应用程序,以及由文本和图像组成的自定义对象的资源,由预加载器从各种URL组装到对象中。

  2. 加载完成后,Preloader会将main.swf添加为子项。 Preloader然后在main.swf上调用
    init(myCustomObject)
    ,其中myCustomObject是在步骤1期间由预加载器汇编的对象的引用,
    public function init(customObject:CustomObject):void)
    是Main.as中的方法签名。 (Preload.as将Main转换为类型为*的对象,以便能够调用任意函数而不必担心编译时错误。)

  3. Main.as实际上是应用程序本身的容器,因此它实例化了一个
    new Application(customObject);
    ,它传递了对预加载器组装的customObject的引用,并将其作为子项添加。
  4. 我已经安装了thunderbolt所以我可以在应用程序运行时记录消息,这就是我已经确定的事情。在步骤3中实例化Application对象是导致问题的原因;由于某种原因,声明 Main.as中的myMainApplication = new Application(customobj);抛出一个可爱的#1009错误,通常表示空指针引用或类似的东西。

    奇怪的是,我已经添加了一些日志记录到Application.as,它似乎正在接收customObject的引用而没有问题;在toString()的构造函数中的customObject上调用Application可以准确返回预期的数据。

    换句话说,Main.as中的语句myMainApplication = new Application(customobj);似乎是成功的并且同时失败了。是什么给了什么?

5 个答案:

答案 0 :(得分:1)

我的猜测是你的应用程序域中的转换,所以尽管类型是相同的文件,但在每个应用程序域的内存中它们是2个单独的具体类型。有很多方法可以解决这个问题,可能从加载到兄弟应用程序域而不是子域开始,或者不打算使用强制转换并在无类型对象上显式调用有问题的函数。

如果实际上是这个问题,

WeLoveAppDomain应该有所帮助。你能把最小的例子放在一起来证明我们解构的失败吗?

答案 1 :(得分:0)

确保Flash Player中的全局安全设置允许本地访问目录。

试试这个。转到发布设置 - 本地回放安全性 - 选择“仅限访问网络”。 Flash CS4默认为“仅访问本地文件”,它可能不喜欢。我希望这很有用。

请参阅: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/system/Security.html

答案 2 :(得分:0)

我认为我们需要查看更多代码,但要开始:“customobj”......你在哪里定义?您在其他地方引用“customObject”。那是一个错字吗?如果确切的判断错误,则“customobj”很可能为空。

答案 3 :(得分:0)

您使用的是FlexBuilder / FlashDevelop还是Flash IDE? 另外,你是如何设置Preloader的?

如果使用FlexBuilder / FlashDevelop构建应用程序,是否在编译器选项中指定了帧开头?

答案 4 :(得分:0)

myMainApplication = new Application(customobj);似乎成功并且同时失败的原因是我没有完全理解try/catch块在AS3中的运行方式。在Application的构造函数的子例程中抛出了一个空指针异常,发生在Application检查的代码之后,以确保它接收对customobj的引用。围绕try/catchApplication即时消息的Main阻止了此错误,因为它是最近的封闭错误检查代码。

希望我的错误会拯救别人制作类似的东西!