zoukankan      html  css  js  c++  java
  • 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。

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

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

      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的代码看作一个整体。

  • 相关阅读:
    表单验证
    obs 之 OBSObj
    rtmp流媒体协议分析(h264、aac)
    lintcode 508.Wiggle Sort
    SVN备份批处理文件
    防火墙没关导致 ORA-12541: TNS: 无监听程序
    [转]window10系统安装oracle11g时遇到INS-13001环境不满足最低要求
    关键驱动因素、约束和浮动因素
    C#之虚函数 非常清晰全面的讲解
    今天有个朋友问我抽象方法和接口的区别,为了解释清楚这个事情,我在网上看到一篇文章讲的非常好给大家分享一下,也感谢原作者的付出
  • 原文地址:https://www.cnblogs.com/zilongblog/p/4874413.html
Copyright © 2011-2022 走看看