我遇到了在另一个内部运行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版本)。那是对的吗?有没有办法避免这种情况,同时保持它们在同一个类路径上?或者是其他问题?
提前致谢!
答案 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());
这将导致冲突的定义在其自己的域中单独存在。