加载外部swf使用旧代码?

时间:2011-03-25 14:56:53

标签: actionscript-3 class flash loader

我遇到了在另一个内部运行swf的问题。它似乎运行不正确的代码版本。以下是对环境的解释。

a.swf(Document class:ClassA())通过典型的加载方法加载到b.swf(Document class:ClassB())中:

var _loader:Loader = new Loader();
addChild(_loader);
//add relevant event listeners...
_loader.load(new URLRequest("b.swf"))

现在,ClassB的构造函数是这样的:
public function ClassB()
{
trace("ClassB() version 1.0");
}

如果我同时发布a.swf和b.swf,将b.swf加载到a.swf中,我会得到跟踪“ClassB()version 1.0”

现在,如果我将ClassB()更新为trace("ClassB() version 1.1")发布b.swf,然后运行a.swf,我希望输出为“ClassB()版本1.1,“然而,它仍然是”ClassB()版本1.0“!

我不确定发生了什么。

a.swf肯定正在加载b.swf的新版本(我在b.swf中更改了舞台上的对象,这是作为ClassA()的子节点添加的,所以这些更改显示了......)但是它仍在运行ClassB代码的旧版(1.0)。我也通过自己运行b.swf验证了这一点,它显示了1.1

如果我重新发布a.swf

,我可以让它运行ClassB的1.1版本

我能想到的第一件事是ClassA和ClassB共享相同的类路径,所以当我发布a.swf时,它包含当时创建的ClassB版本(1.0),然后运行 版本(而不是b.swf中的新/ 1.1版本)。那是对的吗?有没有办法避免这种情况,同时保持它们在同一个类路径上?或者是其他问题?

提前致谢!

1 个答案:

答案 0 :(得分:2)

如果A.swf编译了ClassB的副本,则可以这样做。默认情况下,B.swf将被加载到A ApplicationDomain的子级中。这意味着如果存在冲突的类定义(在本例中为ClassB),则将使用父级的定义。如果旧的ClassB版本也编译成A.swf,那么将使用该版本的类。如果文件共享相同的类路径,则可能很容易发生这种情况。

正如goliatone指出的那样,检查A.swf中是否有对ClassB的引用 - 例如,var foo:ClassB。这会导致ClassB被编译成A.swf。您还可以通过选中“发布属性 - > Flash”中的“生成大小报告”在Flash IDE中对此进行验证。

如果您尝试动态地将ClassB作为模块加载,那么您可能不希望将ClassB编译到A中。要在A.swf中不编译ClassB,您可以明确告诉编译器不要在A.swf中包含ClassB。您可以通过将-externs ClassB添加到mxmlc命令行来执行此操作。 Flash Builder,FlashDevelop等在项目属性中有此选项。

或者,您可以删除A.swf中对ClassB的所有引用。如果必须实例化它,请间接执行此操作:new (_loader.contentLoaderInfo.applicationDomain.getDefinition("ClassB") as Class)

您还可以将B.swf加载到其自己的独立ApplicationDomain中:_loader.load(url, new LoaderContext(false, new ApplicationDomain());这将导致冲突的定义在其自己的域中单独存在。