flash的动态加载技术

  这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载。即主swf在运行的时候, 可以根据需要动态加载所需的代码模块。

  为了讨论方便, 下面所说的代码模块都用swc表示,用以与主swf的区分。 因为swc实际是swf + xml + 文件夹的一个压缩包, 所以动态加载swc比动态加载swf只多了一个步骤, 即解压的过程。

  这里有一个常识, 如果是在fb中或其他as开发环境中开发, 一个主swf工程如果想引用一个swc库, 那么必须在主swf工程中引用swc库本身或者直接包含swc所对应的工程,而这种引用都有两种方式:

  Merged into code,即把所需的swc中的代码在编译时编译到主swf里。

  External, 不会把所需的swc中的代码在编译时编译到主swf里。

  动态加载技术则需要采用External这种方式引用swc, 这里引用只是告诉编译器可以找到所用到的代码(类), 但是不会把实际的代码编译到swf中, 所以如果在运行swf时, 如果不在合适的时机加载的swc, 就会报找不到某个类的运行时错误。错误信息类似于:

  VerifyError: Error #1014: 无法找到类 test.swc::BaseEntity。

 

  假设模块间的引用如下图:

flash的动态加载技术_第1张图片

  其中模块间的虚线代表外部引用, 实线代表嵌入式引用。

  BaseEntity是定义在ExternalSwc中的一个类, Entity继承于BaseEntity, EntityProxy引用到BaseEntity, 后两者可以根据需要定义在Client或者EmbededSwc中。

  这里提及的对象间的引用, 比如EntityProxy引用到BaseEntity, 主要是指下述三种情况:

  1、BaseEntity作为EntityProxy的成员变量。

  2、BaseEntity作为EntityProxy的成员函数的参数。

  3、BaseEntity在EntityProxy的成员函数中作为局部变量。

   

  对于BaseEntity定义在ExternalSwc中的类, 在Client和EmbededSwc中只能发生第3种引用方式, 否则会报错。

  对于Entity这种直接继承与BaseEntity的类, 且是定义在Client或者EmbededSwc中。如果在Client中被引用到, 那么无论Entity是位于Client还是位于EmbededSwc中(也就是最终Client中会包含Entity的代码), 都会报如下类似错误:

  VerifyError: Error #1014: 无法找到类 Entity。

  原因在于虽然Client包含Entity的代码, 却没有包含Entity的基类代码, 而flash player在运行Client的时候首先会对Client的代码做初步的验证。

 

  对于EntityProxy这种引用到BaseEntity的类, 如果在Client中被引用到, 那么它是位于Client还是位于EmbededSwc中稍微有点区别。

  如果是位于Client中, 则EntityProxy只能发生第3种引用方式, 否则会报错。

  如果是位于EmbededSwc中, 则可以发生上述任意一种引用方式。

  为什么有上述区别, 原因尚不清楚, 难道这时候flash player不是把编译好的Client和EmbededSwc的代码看作一个整体。

你可能感兴趣的:(flash的动态加载技术)