0

我遇到了类似的问题,但是我解决最后一个问题的方法在这里不起作用。

我有一个由 12 个单独的 .as 模块组成的自定义类。它们在文档类中声明如下:

import trailcrest.v1.s3.averta;
import trailcrest.v1.s3.chronos;
import trailcrest.v1.s3.eripio;
import trailcrest.v1.s3.fabrilla;
import trailcrest.v1.s3.gradua;
import trailcrest.v1.s3.lingua;
import trailcrest.v1.s3.navigare;
import trailcrest.v1.s3.pedem;
import trailcrest.v1.s3.praeferre;
import trailcrest.v1.s3.scriba;
import trailcrest.v1.s3.securos;
import trailcrest.v1.s3.sonus;

public static var Averta:averta = new averta();
public static var Chronos:chronos = new chronos();
public static var Eripio:eripio = new eripio();
public static var Fabrilla:fabrilla = new fabrilla();
public static var Gradua:gradua = new gradua();
public static var Lingua:lingua = new lingua();
public static var Navigare:navigare = new navigare();
public static var Pedem:pedem = new pedem();
public static var Praeferre:praeferre = new praeferre();
public static var Scriba:scriba = new scriba();
public static var Securos:securos = new securos();
public static var Sonus:sonus = new sonus();

这是代码的新版本。我能够成功地引用所有这些类以及“osr.as”文档类中的公共变量和函数。我还可以从另一个模块中看到一个模块(即 Sonus 可以使用“osr.Scriba”看到 Scriba。

我遇到的问题是,虽然各种模块过去能够完美地访问彼此的所有公共函数和变量,但在我添加了一些新的模块和变量并删除了一些旧的之后,Flash Professional 仍然在字面上使用旧版。在任何模块内部,代码提示都显示了所有旧的公共函数和变量,而没有显示新的。

我猜这与某种我无法访问的临时文件有关。这周我绝对需要这个工作!

我的 .fla 是“Tester.fla”,文档类是“osr.as”。它们都在同一个目录中。同样在同一目录中的是文件夹结构“/trailcrest/v1/s3/”,其中包含所有 Trailcrest 模块。

帮助??

编辑:每当我尝试从另一个 Trailcrest 类(即osr.Sonus.foo)中引用一个 Trailcrest 类时,我得到...

TypeError:错误 #1009:无法访问空对象引用的属性或方法。

我毫无疑问地确认了所有参考资料。

4

2 回答 2

1

这是一个古老的问题,最终归结为验证错误。当您在一个或多个应用程序、模块、swf 等中嵌入“A 类”时,就会发生这种情况。最终,当“A 类”更改时,必须重新编译使用“A 类”的每个输出 swf。否则,您最终会遇到 1 个模块具有较新实现而其他模块没有的情况。当应用程序域遇到同名/包的类时,应用程序域被定义为“第一个获胜”,这使这个问题变得更加复杂——这意味着如果首先引用旧的,那么稍后加载的新的将被忽略。

更持久的解决方案是对 RSL 使用类提升,最终允许 RSL 控制实际的“A 类”引用,其中它还实现所有模块使用的“IClassAImpl”接口。这允许编译器将引用与它知道的签名交叉链接,而无需实际嵌入实际的类本身。

于 2012-11-12T22:10:09.133 回答
0

好吧,我终于想通了。这是正在发生的事情的简要说明:

#1:Flash 显然是在拉取旧版本的 Trailcrest 模块。为了解决这个问题,我备份了所有内容,然后从我的整个计算机中删除了所有旧的 Trailcrest 实例。然后,我只放回新模块。这解决了代码提示显示旧模块和变量的问题。

#2:每当一个 Trailcrest 类尝试访问另一个 Trailcrest 类的任何组件时,我都会遇到错误 #1009,即使引用都是正确的。

原因是我在函数之外直接从文档类 osr.as 调用各种模块上的函数。当然,这在程序启动时执行。

但是,一个 Trailcrest 类中调用另一个 Trailcrest 类(即osr.Sonus.foo)的所有代码都无法访问“foo”,因为 osr.as 出于某种原因在运行调用它们的代码之前还没有完成初始化这些类. 即使问题代码远低于初始化类的代码(请参阅我的问题),也会发生这种情况。

为了解决这个问题,我只需将问题代码包装到文档类中的公共静态函数中,然后从时间轴中调用它。这确保了所有类在尝试相互引用之前都已初始化。

不用说,现在一切都像一台运转良好的机器一样运转。多么奇怪。

我欢迎任何解释为什么这解决了这个问题。

于 2012-11-17T00:04:35.403 回答